Dis*_*ame 33 osx shell bash case-sensitivity hfs+
为什么是这样?
当我这样做时
CD ~/Desktop
Run Code Online (Sandbox Code Playgroud)
它不会带我进入桌面。但是这个:
echo "foo
bar" | GREP bar
Run Code Online (Sandbox Code Playgroud)
给我:
bar
Run Code Online (Sandbox Code Playgroud)
Mic*_*mer 71
根据您的其他问题,我认为您使用的是 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的缘故,无论如何,这对于本身的变化目录,然后立即终止,留下周围的外壳它开始的地方。
您可以使用type
内置函数尝试这些:
$ type cd
cd is a shell builtin
$ type CD
CD is /usr/bin/CD
Run Code Online (Sandbox Code Playgroud)
type
告诉您运行该命令时 shell 将执行的操作。当您运行时,cd
您会访问内置函数,但会CD
找到可执行文件。对于其他内置函数,内置函数和可执行文件将相当兼容(尝试echo
),但这cd
是不可能的。