2010-09-18 70 views
5

當我創建我自己的shell時,我無法執行我能夠在Linux shell中執行的cd命令。這是爲什麼?爲什麼cd命令不能在我的shell程序中工作?

+0

如果錯誤是「未找到命令」,則可能與「PATH」有關。 'echo $ PATH'說什麼? – 2010-09-18 05:38:25

+1

你創建了你自己的shell?沒有'cd'命令?你爲什麼這麼做? – Johnsyweb 2010-09-18 05:41:53

回答

5

這可能是因爲cd命令必須內置到shell中,而不是外部和執行的東西。如果外部命令更改了目錄,則它對父shell沒有影響。沒有命令/bin/cd/usr/bin/cd


我不懂行「如果外部命令更改目錄,這對父shell沒有任何影響」。

通常情況下,當一個shell執行命令,它fork()和子進程使用exec()執行由用戶輸入的命令。例如,如果輸入的命令是'ls /',那麼shell會安排執行/bin/ls,並帶有兩個參數ls/。但是,如果選擇的命令執行chdir()系統調用,則會影響子進程,但不會影響父shell。所以,外殼必須處理cd命令本身,而不是通過fork()exec()

請注意,在DOS中,.BAT文件可以執行cd並且它會影響cmd.exe進程。這在Unix中不會發生 - 子進程不會影響父進程的當前目錄。

+0

感謝您的答案,但我不明白的行「如果外部命令更改目錄,它對父shell沒有影響」。 – phani987 2010-09-18 05:36:21

+2

Unix/Linux和DOS是相同的,每個進程都有自己的當前目錄。不同的是,在DOS中,BAT文件(和嵌套的BAT文件)由當前的cmd.exe進程運行,而在Unix/Linux中,運行shell腳本啓動一個新的shell進程。在Unix/Linux中,如果在腳本中運行CD,它將更改該shell的當前目錄,這將影響同一腳本中後續的命令。但啓動腳本的shell不受影響。 – 2010-09-18 06:01:02

+0

@阿德里安:你是對的 - 我想知道是否要留下最後一段,或者是否會混淆OP。你的解釋比我的更清楚。 – 2010-09-18 06:13:02

2

Jonathan Leffler解釋了爲什麼會出現這種情況,但我想提供一種解決方法,以防您實際需要此功能。在bash中(你沒有指定,所以我假設),可以使用source命令在CURRENT shell進程中執行shell腳本。我使用類似於下面的(雖然比較全面的)東西,帶外殼的別名一起,更改爲項目目錄,並自動設置環境:

~:$ cat $HOME/bin/goproj 
#!/bin/bash 
... 
export SOMEVAR=someval 
cd /home/foo/src/projects/"$1" 
... 

~:$ alias gp 
alias gp="source $HOME/bin/goproj" 

~:$ gp foo 
~/src/projects/foo:$ echo $SOMEVAR 
someval 
~/src/projects/foo:$ 

使用這種類型的設置,您可以修改當前shell與您正在採購的腳本中存在的任何內容。請注意,如果您直接運行'goproj',則它不適用於您已經遇到的相同問題;您必須撥打電話source

+0

現在我重讀了這個問題,這可能很難打出:-)哦。 – 2010-09-18 07:19:22

+0

+1:當shell在內部實現了'cd'命令(以及''source'或'.'命令)時,這很有用。 AFAICT,問題是關於一個沒有實現'cd'的home-brew shell(通過'chdir()'系統調用),因此沒有任何資源可以幫助改變目錄直到它實現。 – 2010-09-18 07:21:53

+0

是的,我收集了我的心理解析器的第二遍。 – 2010-09-18 07:24:56

0

這很簡單,只要:

  • cd不是命令。

試試這個:

- whereis ls

- whereis cd

(見的區別)

  • cd是外殼的特性,因此,如果您正在一個外殼,那麼你必須支持cd

看到這樣,當執行ls時就需要知道pwd。所以,它是你的自定義shell來處理目錄。所以,它的外殼必須支持cd。

我想我已經說清楚了。

相關問題