2016-08-04 87 views
0
$ cat $(which cd) 
#!/bin/sh 
# $FreeBSD: src/usr.bin/alias/generic.sh,v 1.2 2005/10/24 22:32:19 cperciva Exp $ 
# This file is in the public domain. 
builtin `echo ${0##*/} | tr \[:upper:] \[:lower:]` ${1+"[email protected]"} 

我的興趣在於瞭解誰在調用cd後記錄狀態更改。它在一個文件中?有人可以解釋`cd` shell命令的來源嗎?

+0

這不是'cd' builtin的來源;這是調用內建的shell腳本的來源。 – melpomene

+0

我不明白你的問題。你在尋找源代碼嗎?這是一個內置的shell。 shell跟上它認爲工作目錄的目錄。 –

+0

內建沒有源代碼;它內置在shell中(如名稱所示)。 – melpomene

回答

4

這是cd內置,它不實際工作,只是判斷一個目錄可以變成,用如果不能非零退出狀態失敗。

試試:

"$(which cd)"/

...什麼也不做。


實際cd內置的是你的殼,用C語言編寫的一部分,並調用系統調用chdir()。這個系統調用更新你的進程的狀態 - 由內核跟蹤 - 有一個不同的工作目錄。


...所以,什麼 shell腳本的該塊做什麼?讓我們來分析一下:

builtin `echo ${0##*/} | tr \[:upper:] \[:lower:]` ${1+"[email protected]"} 

...首先,我們echo荷蘭國際集團的命令本身(有點越野車的時尚,由於缺乏引號)到tr,並更改爲全小寫,如果通過名爲CD的硬鏈接調用它,它仍然會映射到名爲cd的內建程序。

...第二,${1+"[email protected]"}通過,傳遞的所有參數("[email protected]")如果有任何參數(${foo+bar}擴展爲bar僅當foo被定義)。

因此,我們調用shell內置的cd(這又調用chdir()系統調用),並傳遞參數。除了確定成功或失敗之外,這個內建沒有任何作用的原因是因爲它從調用它的可執行文件開始運行 - 所以它會更改由shebang啓動的shell的工作目錄,但不會更改任何進程或樹上方的外殼。


那麼,什麼是一個真正的cd內置的樣子?由於它簡短易讀,讓我們看一下Busybox ash的實現。

  • Here是入口點...
  • Here是實際操作。
  • Here是由實際操作調用的系統調用手冊。