为什么 Shell 内置命令不能用大写字母运行,而其他命令可以?

为什么 Shell 内置命令不能用大写字母运行,而其他命令可以?

为什么是这样?

当我这样做时

CD ~/Desktop

它不会带我到桌面。但是这个:

echo "foo
bar" | GREP bar

给我:

bar

答案1

从你的其他问题来看,我认为你正在使用 OS X。OS X 上的默认 HFS+ 文件系统不区分大小写:你不能在同一目录中有两个名为“abc”和“ABC”的文件,并尝试访问任一名称都将到达同一个文件。在 Cygwin 下或使用不区分大小写的文件系统(例如 FAT32 或CIOPFS)任何地方。

由于grep是真正的可执行文件,因此它会在文件系统中查找(在目录中PATH)。当您的 shell 查找/usr/bingrep时,GREP它会找到grep可执行文件。

Shell 内置函数是不是在文件系统上查找:因为它们是内置的,所以可以通过 shell 本身内部的(区分大小写)字符串比较来访问它们。

您遇到的情况是一个有趣的案例。 whilecd是一个内置函数,访问时区分大小写,CD被发现为可执行文件/usr/bin/cd。可执行文件cd毫无用处:因为cd影响当前 shell 执行环境,它始终作为 shell 常规内置提供,但是有一个cd可执行文件为了 POSIX 的缘故无论如何,它会更改自身的目录,然后立即终止,将周围的 shell 留在它开始的地方。

您可以使用以下命令尝试这些type内置:

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

type告诉您当您运行该命令时 shell 将执行什么操作。当您运行时,cd您会访问内置程序,但CD会找到可执行文件。对于其他内置函数,内置函数和可执行文件将相当兼容(尝试echo),但这cd是不可能的。

相关内容