2013-07-19 37 views
1

我正在編寫一個bash腳本(稱爲gotodir.sh),並希望在腳本過程中更改目錄,具體取決於某些變量,如cd /home/username/${FOO}/${BAR}如何在bash腳本中運行cd(subshel​​l外)

由於目錄僅在子shell中進行了更改,因此只要在進程退出時按原樣運行即不起作用。

我的shell是tcsh。 (是的,我知道...在這裏不是我的選擇。)在我的.cshrc文件中,我想要將關鍵字 gotodir別名爲gotodir.sh

我讀過,執行腳本時使用.source前綴會導致腳本在同一個shell中運行(即不是子shell)。

我試圖把我的的.cshrc文件中的以下內容:

alias gotodir . /home/username/bin/gotodir.sh 

但這會導致錯誤:/bin/.: Permission denied.

我一直在使用source代替.

alias gotodir source /home/username/bin/gotodir.sh 
也嘗試

但這會導致錯誤:if: Expression Syntax.

如何在運行tcsh時使用bash腳本完成此操作?

+0

你在腳本的頂部是否有'#!/ bin/bash'並執行腳本'chmod + x/home/username/bin/gotodir.sh'的權限? – KeepCalmAndCarryOn

+0

@KeepCalmAndCarryOn是的,是的。不幸的是,沒有那麼容易修復。 :( –

回答

3

當您從得到一個來自tcsh的文件時,它tcsh運行這些命令。 #!作爲註釋被忽略,因爲您沒有將該文件作爲腳本運行,只是從它讀取命令,就好像它們已經在shell提示符處輸入一樣。

你的任務註定要失敗。只有tcsh cd命令可以更改tcsh進程的當前目錄。

但是,如果您願意稍微彎腰一點,可以編寫一個腳本作爲單獨的進程運行,並將該目錄的名稱輸出到cd。然後設置別名像

alias gotodir 'cd `/blah/blah/thescript`' 

附錄

添加一種說法是可能的,但棘手。別名參數看起來像歷史擴展,!:1擴展到第一個參數。但引號不能保護!角色。您必須反斜槓以防止在創建別名期間擴展它,以便在執行別名期間可以完成其工作。

alias gotodir 'cd `/blah/blah/thescript \!:1`' 

可能需要額外的引用來處理其中有空格的參數和目錄。

+0

有趣的概念。那麼腳本應該返回路徑?在bash中如何去解決這個問題? –

+1

只需更換'cd'與'echo' –

+0

如果有什麼腳本打印出的其他信息腳本?現在它打印出錯誤消息並輪詢輸入。 –