Нет, в основном по той причине, что не требуется, чтобы системы соответствовали по умолчанию или соответствовали только стандарту 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 и я запомнил, но остальное правда.)