Unix 如何搜索可执行文件?

Leo*_*nid 59 unix path

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

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

con*_*yer 55

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


Joh*_*n T 20

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

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

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

  • 别名

  • 导出函数

  • 内置 shell 命令

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

  • 我会添加散列 - 记住 bash(可能还有其他 shell)保留最近使用的命令的散列,以便更容易地找到它们。有时,如果更改 PATH 或程序位置,则必须清除缓存(使用 `hash -r`)。 (7认同)
  • +1 表示搜索顺序。如果您能记住信息来源,那就太好了:) (4认同)

Ric*_*lka 10

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

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 的文件。如果执行 $ 执行和 . 不是路径的一部分?

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

也就是说(很抱歉增加混淆)如果有运行命令的别名或函数,它将被运行。或者,如果您的 shell 有一个位置缓存,并且可执行文件在缓存中,它可能会找到它。因此,它永远不会在 PATH 中找到它,但它可能会通过其他方式运行。