這是不的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
的實現。
這不是'cd' builtin的來源;這是調用內建的shell腳本的來源。 – melpomene
我不明白你的問題。你在尋找源代碼嗎?這是一個內置的shell。 shell跟上它認爲工作目錄的目錄。 –
內建沒有源代碼;它內置在shell中(如名稱所示)。 – melpomene