例如,Solaris(一个经过认证的兼容系统)为其实用程序选择了向后兼容性/bin,这解释了为什么它们以神秘的方式运行,并在不同的位置提供符合 POSIX 的实用程序(/usr/xpg4/bin,/usr/xpg6/bin...对于不同版本的 XPG(现已合并POSIX)标准,这些实际上是 Solaris 中可选组件的一部分)。
甚至sh不能保证在/bin。在 Solaris 上,在/bin/shSolaris 10 之前曾经是 Bourne shell(因此不兼容 POSIX),而现在在 Solaris 11 中是 ksh93(仍然不完全兼容 POSIX,但实际上比/usr/xpg4/bin/sh.
从 C 中,您可以使用exec*p()并假设您处于 POSIX 环境中(特别是关于PATH环境变量)。
您还可以设置PATH环境变量
#define _POSIX_C_SOURCE=200809L /* before any #include */
...
confstr(_CS_PATH, buf, sizeof(buf)); /* maybe append the original
* PATH if need be */
setenv("PATH", buf, 1);
exec*p("ps"...);
或者,您可以在构建时确定要运行的 POSIX 实用程序的路径(请记住,在 GNU 等某些系统上,您需要更多步骤,例如设置POSIXLY_CORRECT变量以确保合规性)。
不,它不需要,主要是因为它不要求系统默认符合,或者只符合POSIX 标准(排除任何其他标准)。
例如,Solaris(一个经过认证的兼容系统)为其实用程序选择了向后兼容性
/bin
,这解释了为什么它们以神秘的方式运行,并在不同的位置提供符合 POSIX 的实用程序(/usr/xpg4/bin
,/usr/xpg6/bin
...对于不同版本的 XPG(现已合并POSIX)标准,这些实际上是 Solaris 中可选组件的一部分)。甚至
sh
不能保证在/bin
。在 Solaris 上,在/bin/sh
Solaris 10 之前曾经是 Bourne shell(因此不兼容 POSIX),而现在在 Solaris 11 中是 ksh93(仍然不完全兼容 POSIX,但实际上比/usr/xpg4/bin/sh
.从 C 中,您可以使用
exec*p()
并假设您处于 POSIX 环境中(特别是关于PATH
环境变量)。您还可以设置
PATH
环境变量或者,您可以在构建时确定要运行的 POSIX 实用程序的路径(请记住,在 GNU 等某些系统上,您需要更多步骤,例如设置
POSIXLY_CORRECT
变量以确保合规性)。您还可以尝试以下操作:
希望有一个
sh
in$PATH
,它类似于 Bourne,还有一个getconf
,并且它是您感兴趣的 POSIX 版本的那个。实际上,我基本上会回答yes。POSIX 确实保证:
尽管不一定保证每个实用程序都应位于所有系统的特定目录中 (
/bin/ps
),但始终保证能够在系统默认 PATH 中以可执行文件的形式找到它。实际上,在标准中执行此操作的唯一标准指定方法是(在 C 中)通过
unistd.h
_CS_PATH 或在 shell 中,通过command
和getconf
实用程序的组合,即必须始终返回符合POSIXPATH="$(command -p getconf PATH)" command -v ps
的唯一绝对路径在特定系统上提供。也就是说,虽然系统默认 PATH 变量中包含哪些路径是由实现定义的,但这些实用程序必须始终在其中指定的路径之一中可用、唯一且兼容。ps
请参阅:< unistd.h >,命令。