Нет, в основном по той причине, что не требуется, чтобы системы соответствовали по умолчанию или соответствовали только стандарту POSIX (исключая любой другой стандарт).
Например, Solaris (сертифицированная совместимая система) выбрала обратную совместимость для своих утилит /bin
, что объясняет, почему они ведут себя непонятным образом, и предоставляет POSIX-совместимые утилиты в отдельных местах ( /usr/xpg4/bin
, /usr/xpg6/bin
... для разных версий XPG (теперь объединены). в стандарт POSIX), которые на самом деле являются частью дополнительных компонентов в Solaris).
Даже sh
не гарантированно будет в /bin
. В Solaris /bin/sh
раньше была оболочка Bourne (поэтому не POSIX-совместимая) до Solaris 10, в то время как в 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
переменной для обеспечения соответствия).
Вы также можете попробовать такие вещи, как:
execlp("sh", "sh", "-c", "PATH=`getconf PATH`${PATH+:$PATH};export PATH;"
"unset IFS;shift \"$1\";"
"exec ${1+\"$@\"}", "2", "1", "ps", "-A"...);
В надежде , что есть sh
в $PATH
, что это Bourne-подобный, что есть также getconf
и что это один для версии POSIX вы заинтересованы в.
/bin
, т. Е./bin/ed
Должны использоваться если ed установлен. Я не могу найти его прямо сейчас, но я знаю, что LSB зависит от этого, и я успешно защитил отчеты об ошибках, используя это в качестве обоснования, поэтому, по крайней мере, в какой-то момент это должно было быть правдой. (Или это было что-то отличное от POSuX и я запомнил, но остальное правда.)