如果 PATH 中的不同位置有多个同名的二进制文件,则使用哪个二进制文件(根据规范)?

如果 PATH 中的不同位置有多个同名的二进制文件,则使用哪个二进制文件(根据规范)?

如果 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,事情就会崩溃。

答案1

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

相关内容