2013-08-21 89 views
0

我想從shell腳本中設置一個適用於當前shell(我從中運行腳本的shell)的別名。別名是cd - 進入腳本的文件夾。這裏的(不工作)腳本:如何從shell腳本設置別名?

#!/bin/bash 
shopt -s expand_aliases 

DIR=$(cd $(dirname "$0"); pwd) # Detect the folder of the script. 
alias cdr="cd $DIR" # cd into the folder. 

我很快意識到,這並沒有工作,因爲它所做的別名是相關的腳本的子shell。

然後,我試圖源文件(如在. makeAlias.sh)。但是,這產生了一個錯誤:dirname: illegal option -- b

我怎樣寫一個bash腳本,使得相關的外殼(運行該腳本的外殼)的別名?

回答

1

眼前的問題是,$0值現在-bash是。您可能需要重構代碼以使用不同的參考點,或者直接對路徑進行硬編碼。

要回答「我怎麼......?」你沒有做錯什麼,只是邏輯必須適應不同的環境 - 特別是,當你編寫腳本時,$0是父進程的名稱,而不是你正在採購的腳本的名稱。

取決於你試圖完成什麼,也許這另類的設計可以工作?

newr() { r=$(pwd); } 
cdr() { cd "$r"; } 
newr 

也就是說,cdr只是改變目錄到任何變量r包含。使用功能newr可以方便地將r設置爲您當前的工作目錄。你會在你的.bashrc或類似定義這些,並利用它們交互

+0

我試圖找到一個很好的鏈接爲什麼超過別名喜歡的功能,但找不到任何合理的簡潔和正確的。可能我太懶惰了。無論如何,別名有一些不幸的和輕度驚人的副作用,例如當您嘗試提供參數並且別名不需要它們時。 – tripleee

1

./makeAlias.sh將在一個子shell執行,所做的更改只有到子shell適用。一旦命令終止,子shell就會執行並且更改。

採購使用. ./makeAlias.shsource ./makeAlias.sh將讀取並從在當前外殼上下文的文件名參數執行命令,當腳本使用source它運行在現有外殼中運行的是文件,創建或修改的任何變量該腳本將在腳本完成後保持可用狀態。