当一个文件被执行时,Unix 如何搜索它?如果PATH中有多个同名的可执行文件,首选哪一个?执行文件时搜索中是否包含当前目录?
假设executable.sh
当前目录中有一个带有名称的文件。如果它被执行$ executed
并且.
不是 的一部分,那会起作用PATH
吗?
Joh*_*n T 20
对于当前目录中的文件,您需要在它们前面加上./
,因此命令将变为./executable.sh
. 你永远不应该.
在你的 PATH 中,因为它会带来安全风险和其他问题。
在 PATH 中首先出现并首先搜索的目录。
如果我没记错的话,搜索的总体顺序是这样的:
别名
导出函数
内置 shell 命令
PATH 中的脚本和二进制文件
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 中找到它,但它可能会通过其他方式运行。