Ні, це відбувається, головним чином, з тієї причини, що він не вимагає, щоб системи за замовчуванням відповідали системам або відповідали лише стандарту POSIX (виключаючи будь-який інший стандарт).
Наприклад, Solaris (сертифікована сумісна система) обрала зворотну сумісність для своїх утиліт, в /bin
якій пояснюється, чому вони поводяться таємно, та надає утиліти, сумісні з POSIX, в окремих місцях ( /usr/xpg4/bin
, /usr/xpg6/bin
... для різних версій XPG (тепер об'єднана) в стандарт POSIX), які фактично є частиною необов'язкових компонентів у Solaris).
Навіть sh
не гарантовано буде в /bin
. На Solaris, який /bin/sh
раніше був оболонкою Bourne (тому не сумісний з POSIX) до Solaris 10, в даний час це ksh93 в Solaris 11 (все ще не повністю 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
повинні бути корисними якщо редактор встановлений Я зараз не можу його знайти, але я знаю, що від цього залежить LSB, і я успішно захищав бугрепорти, використовуючи це як обґрунтування, тому це, мабуть, було правдою в якийсь момент. (Або це було щось інше, ніж POSuX, і я згадую, але все інше правда.)