Unix 如何搜索可执行文件?

Unix 如何搜索可执行文件?

当执行一个文件时,Unix 如何搜索它?如果 PATH 中有多个同名的可执行文件,会优先搜索哪一个?执行文件时搜索时是否包括当前目录?

executable.sh假设当前目录中有一个名为的文件。如果它被执行$ executed并且.不是 的一部分,那会起作用吗PATH

答案1

从头到尾搜索 $PATH,运行第一个匹配的可执行文件。因此,位于 $PATH 开头的目录优先于后面的目录。当前目录 (.) 中的可执行文件只有在 . 位于 $PATH 中时才会执行(它通常不是)。搜索路径中没有隐式地包含当前目录。

答案2

对于当前目录中的文件,您需要在它们前面加上./,因此命令将变为./executable.sh。您永远不应该.在 PATH 中使用 ,因为它会带来安全风险以及其他问题。

在 PATH 中首先出现并首先搜索的目录。

整体秩序如果我没记错的话,搜索是这样的:

  • 别名

  • 导出函数

  • 内置 shell 命令

  • PATH 中的脚本和二进制文件

答案3

虽然其他人已经很好地回答了这个问题,但我还是想补充一些想法:

1) 仅当调用的可执行文件不包含路径元素时,才会查询 PATH。somecommand 将在 $PATH 中查找,./somecommand或者/usr/bin/somecommand,或者../../bin/somecommand仅使用目录规则,而不是 PATH

如果 PATH 中有多个同名的可执行文件,那么优先选择哪一个?

它会在找到的第一个位置停止,并从左到右读取 $PATH。

执行文件时当前目录是否包含在搜索中?

如果当前目录在 PATH 中,则搜索该目录。请记住,PATH 中的空目录包含当前目录。例如 PATH=:/usr/bin(前导空)PATH=/usr/bin:(尾随空)和 PATH=/usr/bin::/bin(中间空)都将有效包含当前工作目录。

假设当前目录中有一个名为 executable.sh 的文件。如果执行 $ executed 并且 . 不是 PATH 的一部分,那么会起作用吗?

它永远无法通过搜索 PATH 找到它。如果当前目录不在 PATH 中,它就无法通过 PATH 查找找到它。

也就是说(抱歉造成混淆),如果有一个别名或函数运行该命令,它将被运行。或者,如果你的 shell 有一个位置缓存,并且可执行文件在缓存中,它可能会找到它。所以,它将绝不在 PATH 中找到它,但它可能通过其他方式运行。

答案4

@coneslayer- 查找可执行文件的默认顺序是当前路径、内置命令,然后是 $PATH。因此,如果 pwd 中已经存在名为可执行文件的函数,则执行该函数。如果不存在,则优先搜索 shell 的内置命令,然后是 $PATH。

相关内容