如果 PATH 环境变量中的两个不同目录都包含具有相同名称的二进制文件(但行为略有不同),是否有关于使用哪一个的规范/保证?
在我的机器(macOS Monterey,Darwin 21.2.0)上,我观察到(通过which <binary name>
)二进制文件是从 PATH 中找到的第一个目录中选择的(从左到右读取其内容)。但这是所有 Linux/UNIX 操作系统的标准行为吗?即是否有一些强制执行的标准(例如 POSIX)?
额外的上下文(对于好奇的人):我正在编写一个项目,该项目有一个脚本,该脚本在项目特定的文件夹中下载标准二进制文件的自定义版本,然后调用另一个必须使用自定义二进制文件而不是常规二进制文件的脚本。在调用第二个脚本之前,我将包含自定义二进制文件的文件夹添加到 PATH 中。鉴于我在发生冲突时如何搜索 PATH 的观察结果,我将 PATH 设置为而PATH=<my-custom-folder>:$PATH
不是PATH=$PATH:<my-custom-folder>
. 但这个项目有多个合作者,我想确保我们都运行相同的二进制文件。如果不同的操作系统以与我不同的方式搜索 PATH,事情就会崩溃。
POSIX 将库调用定义
execlp(3)
为execvp(3)
在环境变量中搜索PATH
指定可执行文件的位置。(除非可执行文件为其名称指定了相对或绝对路径,例如/bin/ls
或./a.out
。)的POSIX 定义
PATH
是这样的:POSIX shell也必须遵循(第 1e 部分)这种方法,即使它不直接推迟搜索
$PATH
到其中一个exec(3)
函数。因此,为了直接回答您的问题,如果您有一个不合格的命令(例如),则将使用
ls
在 中包含的列表中指定的目录中找到的第一个可执行文件。$PATH
不一定是二进制文件,因为脚本也可以是可执行的。(如果该命令包含/
在其路径名中,则直接使用它,当前目录是相对路径名的起点。)更多地考虑您的潜在需求。也许您应该定义自己的环境变量(
MYAPP_DIR
例如),该变量指向保存应用程序可执行文件的目录。然后,您可以调用等效项,而不是始终依赖$MYAPP_DIR/myutility
用户的正确性。$PATH