2012-03-20 78 views
2

我剛剛瞭解了bash中的別名。我創建了一個像這樣:Subshel​​l未按預期工作的'cd'命令的別名

alias="cd $directory"

其中$directory是從使用的輸入。在另一個shell腳本,我可以啓動一個子shell像這樣:

(bash)

這使我的子shell,在那裏,如果我跑cd,我去了別名,cd $directory。這很好,它似乎按預期工作。

什麼我要找的是當子shell啓動的,該CD自動發生,所以我嘗試:

(bash | cd)

認爲它會啓動子shell和CD的用戶輸入$directory但它不起作用。我怎樣才能讓這個工作?我也試過(bash -c cd)無濟於事。

謝謝。

+0

這是SO的話題。它與編程無關 - 這是一個操作系統問題。因此,應該在[超級用戶](http://superuser.com)上詢問它; SO用於編程相關的問題和答案。請花幾分鐘時間查看[常見問題](http://stackoverflow.com/faq),瞭解哪些問題適用於(和不適用)。謝謝。 :) – 2012-03-20 02:37:25

+0

真的嗎?我認爲bash腳本將被視爲編程...有很多其他的bash相關的問題,所以... – nicorellius 2012-03-20 02:47:23

+0

Bash腳本會。別名是基本的bash操作,而不是腳本。 (詢問如何在bash腳本中做某些事情是在主題上;詢問如何更改bash shell中的目錄或列表文件不是這個問題屬於後一類,即IMO。) – 2012-03-20 02:49:59

回答

3

之所以(bash | cd)不起作用的是,在一個管道的每個命令在一個單獨的亞殼運行,因此(bash | cd)本質上等價於((bash) | (cd))(不同之處在於後者發射甚至更子shell當然)。相反,你應該能夠編寫:

(cd ; bash) 

(運行運行bashcd前),因爲bash將繼承它從啓動子shell的執行環境的一個副本。

順便說一句—您確定要以這種方式創建cd作爲別名嗎?這似乎很容易讓我感到困惑。我認爲最好是創建一個外殼函數cd s到用戶指定的目錄:

function cd_user() { cd "$directory" ; } 

(cd_user ; bash) 
+0

耶,你是對的;我不想以這種方式創建'cd'作爲別名。我只是用它作爲例子。我會做'cd_udir'(就像你指出的那樣)。順便說一句,你的回答也非常翔實。謝謝。現在嘗試。 – nicorellius 2012-03-20 02:51:25

+0

你的答案確實解決了我的問題。謝謝。但我採納了您的其他建議並嘗試了它,但沒有奏效。你能看看我的代碼,並給我一個功能的手?我應該提到subshel​​l在腳本中的另一個函數中被調用,所以我得到一個錯誤:'mmf.sh:line 79:cd_udir:command not found' – nicorellius 2012-03-20 02:58:46

+0

@nicorellius:沒有理由你不應該能夠從另一個功能中調用一個功能。 : -/ – ruakh 2012-03-20 03:01:37