Bash

為什麼 Shell 內置命令不能以大寫字母執行,而其他命令可以?

  • December 29, 2016

為什麼是這樣?

當我這樣做時

CD ~/Desktop

它不會把我帶到桌面。但是這個:

echo "foo
bar" | GREP bar

給我:

bar

根據您的其他問題,我認為您使用的是 OS X。OS X 上的預設 HFS+ 文件系統不區分大小寫:您不能在同一目錄中有兩個名為“abc”和“ABC”的文件,並嘗試訪問任何一個名稱都將到達同一個文件。在 Cygwin 下或在任何地方使用不區分大小寫的文件系統(如 FAT32 或ciopfs)都可能發生同樣的事情。

因為它是一個真正的執行檔,所以在文件系統(在 的目錄中)grep上查找它。PATH當您的 shell 查找/usr/bin其中一個時grepGREP它會找到grep執行檔。

不會在文件系統上查找Shell 內置函式:因為它們是內置的,所以可以通過 shell 本身內部的(區分大小寫的)字元串比較來訪問它們。

你遇到的是一個有趣的案例。Whilecd是一個內置的,區分大小寫訪問,CD作為執行檔被發現/usr/bin/cdcd執行檔非常沒用:因為影響目前的cdshell 執行環境,它總是作為 shell 正常內置提供,但無論如何為了 POSIX有一個cd執行檔,它自己更改目錄然後立即終止,留下周圍的 shell它開始的地方。

type你可以用內置的來試試這些:

$ type cd
cd is a shell builtin
$ type CD
CD is /usr/bin/CD

type告訴您執行該命令時 shell 會做什麼。執行時,cd您可以訪問內置程序,但CD會找到執行檔。對於其他內置程序,內置程序和執行檔將相當兼容(嘗試echo),但這cd是不可能的。

引用自:https://unix.stackexchange.com/questions/164676