POSIX Shell标准在此站点上说
http://pubs.opengroup.org/onlinepubs/9699919799/
有关shell如何PATH
用于查找可执行文件的信息:
“应从头到尾搜索列表,将文件名应用于每个前缀,直到找到具有指定名称和适当执行权限的可执行文件为止。”
嗯,这在实际的POSIX实现中似乎不是这样工作的:
man which
说:
“返回参数(在严格符合POSIX的外壳程序中以命令形式给出)的情况下,将在当前环境中执行的文件(或链接)的路径名。它通过在PATH中搜索与文件名匹配的可执行文件来实现。参数。它不遵循符号链接。”
好,让我们看看这种情况:
$ pwd
/home/mark
$ echo $PATH
/home/mark/bin:
...
$ ls -l bin/foobar
lrwxrwxrwx 1 mark mark 18 Dec 12 22:51 bin/foobar -> /home/mark/foobar1
$ touch foobar1
$ which foobar
$ chmod a+x foobar1
$ which foobar
/home/mark/bin/foobar
好的,这是一个PATH
带有正确名称的符号链接,并且据报告ls
是可执行的。
which
根本不看它,只对它指向的内容感兴趣。
尽管事实上两者都man which
明确表示它不遵循符号链接(并且确实我们没有看到它,因为which foobar
未打印foobar1
),并且上面引用的POSIX shell文档也从未提及PATH
算法中的以下符号链接。
那么,which
现有的外壳是错误的,还是我不理解文档?
澄清:
我知道并可以解释现有的行为。我的问题不是“这是如何工作的?”。我知道
我的问题是关于文档:按照我引用的文档,我的错误在哪里?还是文档错误?
动机:为什么我要在乎?
好吧,我是一个实施者。不同的实施者有不同的要求。对我来说,要求是必须严格遵循当前POSIX标准的字眼(或者,更准确地说,应该是最好的字眼,因为该标准本身有些错误)。就像上帝的道一样。
现在,标准措辞非常清楚-没有提到以下符号链接,在许多其他地方的地方,也需要提到它。因此,在这种情况下,请不要。
但是,我总是要仔细检查操作方式dash
和bash
行为,以确保。当然,现在,这里也有一个小问题,dash
即使它被称为POSIX,也有许多与POSIX一致的小错误。 bash
,我还没有发现POSIX的任何错误,但是... bash实际上不是POSIX,它的意义远不止于此。
所以你有它。这就是为什么我在乎。
$PATH
,没有任何符号链接。
lstat(2)
),通常不会在它们后面说明。例如,open(2)
当谈论的行为时,对的描述仅提及符号链接O_CREAT | O_EXCL
。无需说明将打开目标文件。
$PATH
可以包含符号链接。尝试which sh
。