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


33

为什么是这样?

当我这样做时

CD ~/Desktop

它并不需要我到桌面。但是这个:

echo "foo
bar" | GREP bar

给我:

bar

4
检查alias GREPwhich GREP输出任何东西。
chepner 2014年

1
妳去 您有一个名为的命令GREP,与截然不同grep。(确实,它可能只是的硬链接或符号链接/usr/bin/grep,但从shell的角度来看,这是一个单独的命令。)
chepner 2014年

12
等待:您使用的是Mac OS X,不是吗?HFS +默认情况下保留大小写,这意味着如果创建文件时大小写很重要,但是一旦文件存在,查找将不区分大小写。也就是说,bash可能要求一个名为的文件GREP,但文件系统认为grep匹配。
chepner 2014年

1
是的,因为它是Unix。
DisplayName 2014年

4
文件系统独立于操作系统。您可以在Mac OS X上使用其他文件系统,并且(理论上)可以在其他操作系统上使用HFS +。另外,您可以使HFS +区分大小写;出于历史原因,保留大小写行为只是默认行为。
chepner 2014年

Answers:


71

从其他问题来看,我认为您使用的是OSX。OSX上的默认HFS +文件系统不区分大小写:您不能在同一目录中拥有两个名为“ abc”和“ ABC”的文件,并尝试访问这两个名称都将进入相同的文件。在Cygwin或任何不区分大小写的文件系统(例如FAT32或ciopfs)下,都可能发生相同的情况。

由于grep是真正的可执行文件,因此需要在文件系统中(在的目录中PATH)进行查询。当你的外壳看起来在/usr/bin为任一grepGREP会找到它的grep可执行文件。

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

您遇到的是一个有趣的案例。虽然cd是内置文件,但区分大小写,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告诉您运行该命令时外壳将执行的操作。运行时,cd您访问内置函数,但CD找到可执行文件。对于其他内置程序,内置程序和可执行文件将具有合理的兼容性(try echo),但是cd这是不可能的。


1
好答案。我要说的是cygwin,它会产生相同的效果。
2014年

@Joshua OP的问题已解决,但我认为对于该问题的进一步读者而言,基于Cygwin的答案至少会与现有答案一样有用。也许您可以将其作为一个单独的答案,即使简短,也可以参考现有答案以获取详细信息?
Volker Siegel 2014年

1
为什么posix需要像cd这样的无用命令,为什么osx的内部cd不合格?
约翰

2
51个赞!我应该发布一个答案,而不是发表评论:)
chepner 2014年

1
/ usr / bin / cd有用途。语法是/ usr / bin / cd目录程序参数
Joshua 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.