shell什么时候搜索PATH?

shell什么时候搜索PATH?

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/baror/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

相关内容