2011-07-13 81 views
2

我有一個bash腳本,用於從當前位置的任何位置從源文件移動到bin目錄(我將此腳本稱爲'teleport')。由於它基本上只是一個榮耀的'cd'命令,我必須在當前shell(即./teleport.sh)中運行它。我在.bashrc文件中設置了一個別名,以便'teleport'匹配'。 teleport.sh」。無法在當前環境中多次運行BASH腳本

我第一次運行它,它工作正常。但是,如果我在運行一次後再運行它,它什麼都不會做。如果我關閉我的終端,然後再打開一個新終端,但只有第一次,它會再次運行。我的直覺是,BASH內部有一些我不熟悉的東西,所以我想我會通過這裏的專家來看看我能否得到答案。

的腳本是:

numargs=$# 

function printUsage 
{ 
     echo -e "Usage: $0 [-o | -s] <PROJECT>\n" 
     echo -e "\tMagically teleports you into the main source directory of a project.\n" 
     echo -e "\t PROJECT: The current project you wish to teleport into." 
     echo -e "\t -o: Teleport into the objdir.\n" 
     echo -e "\t -s: Teleport into the source dir.\n" 
} 

if [ $numargs -lt 2 ] 
then 
     printUsage 
fi 

function teleportToObj 
{ 
    OBJDIR=${HOME}/Source/${PROJECT}/obj 
    cd ${OBJDIR} 
} 

function teleportToSrc 
{ 
    cd ${HOME}/Source/${PROJECT}/src 
} 

while getopts "o:s:" opt 
do 
    case $opt in 
    o) 
     PROJECT=$OPTARG 
     teleportToObj 
     ;; 
    s) 
     PROJECT=$OPTARG 
     teleportToSrc 
     ;; 
    esac 
done 

我對它的用法是一樣的東西:

[email protected]:~$ cd /usr/local/src 
[email protected]:/usr/local/src$ . ./teleport -s some-proj 
[email protected]:~/Source/some-proj/src$ teleport -o some-proj 
[email protected]:~/Source/some-proj/src$ 
<... START NEW TERMINAL ...> 
[email protected]:~$ . ./teleport -o some-proj 
[email protected]:~/Source/some-proj/obj$ 

回答

5

的問題是,getopts必然保持狀態的一點點,以便它可以被循環調用,並且你沒有清除那個狀態。每次調用它時,它會處理一個參數,並且它會增加shell的OPTIND變量,以便它知道下次調用哪個參數時進行處理。當它完成所有參數時,每次調用時都會返回1(假),這會使while退出。

第一次輸入腳本時,它按預期工作。第二(和第三,第四...)時間,getopts不做任何事情,但返回false。

添加一行開始循環之前復位狀態:

unset OPTIND # clear state so getopts will start over 
while getopts "o:s:" opt 
do 
    # ... 
done 

(我假設有一個在你的成績單一個錯字,因爲它表明你調用腳本 - 不採購它 - 在第二嘗試,但這不是真正的問題。)

+0

完美工作,謝謝Rob! – jwir3

2

的問題是,你第一次打電話是要採購的腳本(那是什麼」。 ./teleport「)會在當前shell中運行腳本,從而保留cd。第二次調用它時,它不是源代碼,所以你創建了一個子shell,cd到相應的目錄,然後退出subshel​​l,讓你回到你調用腳本的地方!

,使這項工作的方法就是讓teleportToSrc和teleportToObj別名或函數在當前shell(即外部的腳本)

+0

那麼,爲什麼第二次沒有腳本來源?我想我可以製作這些別名......不知道爲什麼我決定讓它們成爲劇本。 – jwir3

+0

即使我做'。 。/ teleport'後調用一次(根據你的最後一個評論我應該認爲它應該來源),它仍然不執行所需的功能。 – jwir3