當我創建我自己的shell時,我無法執行我能夠在Linux shell中執行的cd命令。這是爲什麼?爲什麼cd命令不能在我的shell程序中工作?
回答
這可能是因爲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中不會發生 - 子進程不會影響父進程的當前目錄。
感謝您的答案,但我不明白的行「如果外部命令更改目錄,它對父shell沒有影響」。 – phani987 2010-09-18 05:36:21
Unix/Linux和DOS是相同的,每個進程都有自己的當前目錄。不同的是,在DOS中,BAT文件(和嵌套的BAT文件)由當前的cmd.exe進程運行,而在Unix/Linux中,運行shell腳本啓動一個新的shell進程。在Unix/Linux中,如果在腳本中運行CD,它將更改該shell的當前目錄,這將影響同一腳本中後續的命令。但啓動腳本的shell不受影響。 – 2010-09-18 06:01:02
@阿德里安:你是對的 - 我想知道是否要留下最後一段,或者是否會混淆OP。你的解釋比我的更清楚。 – 2010-09-18 06:13:02
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
。
現在我重讀了這個問題,這可能很難打出:-)哦。 – 2010-09-18 07:19:22
+1:當shell在內部實現了'cd'命令(以及''source'或'.'命令)時,這很有用。 AFAICT,問題是關於一個沒有實現'cd'的home-brew shell(通過'chdir()'系統調用),因此沒有任何資源可以幫助改變目錄直到它實現。 – 2010-09-18 07:21:53
是的,我收集了我的心理解析器的第二遍。 – 2010-09-18 07:24:56
這很簡單,只要:
cd
不是命令。
試試這個:
- whereis ls
- whereis cd
(見的區別)
cd
是外殼的特性,因此,如果您正在一個外殼,那麼你必須支持cd
。
看到這樣,當執行ls時就需要知道pwd。所以,它是你的自定義shell來處理目錄。所以,它的外殼必須支持cd。
我想我已經說清楚了。
- 1. 爲什麼我的cd命令不工作?
- 2. 爲什麼環境變量不能在$(shell)命令中工作?
- 3. bash - cd命令不工作?
- 4. 爲什麼cd不能在我的反轉外殼上工作?
- 5. 爲什麼我的{%extends%}命令在我的django應用程序中工作
- 6. 爲什麼我的應用程序不能在IE中工作?
- 7. 爲什麼vim命令viB不能在ruby中工作?
- 8. 爲什麼這個ssh命令不能在ksh中工作?
- 9. 爲什麼我不能得到一個退出命令工作
- 10. python shell命令 - 爲什麼它不工作?
- 11. rm命令在shell中不工作
- 12. 爲什麼我的一個ScrollViewer命令不能在ListBox模板中工作?
- 13. 在紅寶石的shell cd命令
- 14. 爲什麼我的Perl CGI程序不能在Windows上工作?
- 15. Dockerfile:爲什麼bash命令不工作?
- 16. 爲什麼'shell'不能在VS6中的VBscript中工作?
- 17. CD命令不能在FOR循環內工作?
- 18. 爲什麼我不能爲`git config`命令的`--includes`鍵操作?
- 19. 爲什麼我的shell腳本不能和cron一起工作?
- 20. 爲什麼使用GIT的TFS不能從命令行工作?
- 21. 爲什麼我的DataTrigger不能在我的Xamarin Forms應用程序中工作?
- 22. 爲什麼我不能輸入「|」在codecademy命令行課程?
- 23. 爲什麼事件不能在我的小程序中工作? (他們在原始應用程序中工作)
- 24. 爲什麼我的python程序不能正常工作?
- 25. 爲什麼我的程序不能正常工作
- 26. 爲什麼我的Processing應用程序不能正常工作?
- 27. 爲什麼通過system()或execvp()從子進程調用cd shell命令不起作用?
- 28. 命令「cd WSMan:\ localhost \ shell」是如何工作的?我如何重現它?
- 29. 爲什麼我的cron任務在命令行中工作,但不在PLESK中?
- 30. 爲什麼我的命令按鈕不工作?
如果錯誤是「未找到命令」,則可能與「PATH」有關。 'echo $ PATH'說什麼? – 2010-09-18 05:38:25
你創建了你自己的shell?沒有'cd'命令?你爲什麼這麼做? – Johnsyweb 2010-09-18 05:41:53