为什么是这样?
当我这样做时
CD ~/Desktop
它不会带我到桌面。但是这个:
echo "foo
bar" | GREP bar
给我:
bar
答案1
从你的其他问题来看,我认为你正在使用 OS X。OS X 上的默认 HFS+ 文件系统不区分大小写:你不能在同一目录中有两个名为“abc”和“ABC”的文件,并尝试访问任一名称都将到达同一个文件。在 Cygwin 下或使用不区分大小写的文件系统(例如 FAT32 或CIOPFS)任何地方。
由于grep
是真正的可执行文件,因此它会在文件系统中查找(在目录中PATH
)。当您的 shell 查找/usr/bin
或grep
时,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
是不可能的。