使用完整路径“/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
,那么您会使事情变得比它们需要的更脆弱。
对于我正在编写的 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
,那么您会使事情变得比它们需要的更脆弱。