使用完整路径“/bin/...”调用可执行文件是否可移植?

Is it portable to call executable with full path "/bin/..."?

对于我正在编写的 RTOS (http://www.distortos.org),我需要 运行 find 作为构建配置过程的一部分(来自 make menuconfig 目标)。对于 Windows,我假设用户安装了 MSYS2,因此 find.exe 可用。这个特定文件的唯一问题是 Windows 在 C:/Windows/system32 中也有这样的文件(据说它接近 grep)。因此,根据 PATH 环境变量中文件夹的顺序,如果尝试仅通过名称调用文件,您会得到一个或另一个。

我发现从 Makefile 或 shell 脚本中将此程序调用为 /bin/find 在 Windows 和(我的)[=29] 中都有效=].最重要的是 - 这样做总是从 MSYS2 调用 find.exe,无论 PATH 中的文件夹顺序如何。所以我想知道 - 以这种方式调用 find 是否可以,或者它可能不可移植,我只是很幸运它适合我?

将其称为 /usr/bin/find 可能更便于携带。例如,在 Fedora 上 /bin 实际上是指向 /usr/bin 的符号链接,因此两者都有效:

bash-4.3$ ls -l /bin/find
-rwxr-xr-x. 1 root root 222608 Dec 28 18:26 /bin/find
bash-4.3$ ls -l /usr/bin/find
-rwxr-xr-x. 1 root root 222608 Dec 28 18:26 /usr/bin/find

但是最近 Ubuntu:

root@69ca68fbe5c0:/# ls -l /bin/find
ls: cannot access /bin/find: No such file or directory
root@69ca68fbe5c0:/# ls -l /usr/bin/find
-rwxr-xr-x. 1 root root 229992 Jan  6  2014 /usr/bin/find

我建议不要将路径硬编码到 find,而是指示 Windows 用户他们必须 运行 MSYS2 环境中的脚本。 MSYS2 会将其自己的 bin 目录放在路径的开头附近,以便 find 始终获取 MSYS2 版本而不是 Microsoft 版本。

如果您将路径硬编码到 find,那么您会使事情变得比它们需要的更脆弱。