PATH
我对什么时候搜索有点困惑。我原以为PATH
只有当一个简单的文件名作为一行上的第一个标记给出时才会被搜索,如
$ date
然而,我正在解决的一个问题似乎表明,PATH
当我非常明确地列出带有 ./ 前缀的文件时,也会搜索该问题:
$ ./date
情况确实如此吗?也就是说,如果在我的工作目录中没有可执行文件命名date
(假设date
只是一个脚本),这个问题的答案似乎表明 shell 将继续搜索PATH
(然后date
在某个目录中找到标准实用程序,例如bin
)。
我问了一个有点类似的问题这里那里的答案很好地给出了 shell 搜索的顺序。然而,我强调,我只是将命令作为简单的文件名给出。在这里,我非常明确地给出了一个 ./ 前缀。为什么 shell 仍然在搜索PATH
,或者我遗漏了一些东西?
来自索贝尔的Linux 实用指南:
解释以下意外结果:
$ whereis date
date: /bin/date ...
$ echo $PATH
.:/usr/local/bin:/usr/bin:/bin
$ cat > date
echo "This is my own version of date."
$ ./date
Sun May 21 11:45:49 PDT 2017
人们“期望”shell 脚本./date
运行,以便输出为"This is my own version of date."
答案1
PATH
如果输入在任何地方包含斜杠,则符合 POSIX 标准的行为是不使用该变量。例如,如果命令是foo
,则PATH
搜索 ,但如果是foo/bar
or/foo/bar
或./foo/bar
: 则不搜索带有一个或多个斜杠的任何内容。
如果 shell 必须PATH
在自己的代码库中复制搜索行为,而不是依赖像 之类的函数execvp
,那么它应该避免在输入包含斜杠时进行搜索。
不过,我可以轻松重现你的结果。
从我的终端实际复制粘贴:
$ cat > date
echo "this is my own version of date."
$ ./date
Mon 12 Feb 2024 06:38:20 PM PST
$
我所做的不是Ctrl-D在该echo ...
行之后键入,因此$ ./date
和 the是键入到的标准输入Mon 12 ...
中的所有文本。cat
答案2
仅查看问题中引用的练习,经过一番思考后,我认为定义cat
为执行标准之外的操作的函数或脚本cat
也可能有效。我找到了这本书的一些在线副本,这个练习在第二版、第三版和第四版中都有,输出中的时间戳发生了变化,所以我相信这不是一个拼写错误。
根据echo "This is my own version of date."
第三个命令是输入还是输出,cat
可以是:
cat () {
read; # Reads a line of input, but we won't do anything with it
echo date; # Write to stdout
chmod +x /proc/self/fd/1; # Apply execute permissions to stdout's backing file
}
或者:
cat () {
echo 'echo "This is my own version of date."' >&2 ; # Write to stderr
echo date;
chmod +x /proc/self/fd/1;
}
这样做的原因是:
/proc/self/fd/1
如果 stdout 重定向到文件,则是实际文件的符号链接。chmod
如果给定符号链接作为参数,则更改指向文件的权限。
我检查了 Red Hat 4.2(1997 年发布)的联机帮助页,即使在当时(proc(5)
,chmod(1)
),所以即使回到本书的第一版,这些函数也能正常工作。 (当然,假货也cat
可以直接有。)chmod +x ./date