Nie, nie robi tego, głównie dlatego, że nie wymaga domyślnej zgodności systemów ani zgodności tylko ze standardem POSIX (z wyłączeniem jakiegokolwiek innego standardu).
Na przykład Solaris (system z certyfikatem zgodności) wybrał wsteczną kompatybilność swoich narzędzi /bin
, co wyjaśnia, dlaczego zachowują się one w tajemniczy sposób, i zapewnia narzędzia zgodne z POSIX w oddzielnych lokalizacjach ( /usr/xpg4/bin
, /usr/xpg6/bin
... dla różnych wersji XPG (teraz scalonych) do standardu POSIX), które faktycznie są częścią opcjonalnych komponentów Solaris).
Nawet sh
nie ma gwarancji, że wejdzie /bin
. W Solarisie /bin/sh
była to powłoka Bourne'a (więc nie jest zgodna z POSIX) aż do Solaris 10, podczas gdy teraz jest to ksh93 w Solaris 11 (wciąż nie w pełni zgodna z POSIX, ale w praktyce bardziej niż /usr/xpg4/bin/sh
).
W C możesz exec*p()
założyć i założyć, że jesteś w środowisku POSIX (w szczególności w odniesieniu do PATH
zmiennej środowiskowej).
Możesz także ustawić PATH
zmienną środowiskową
#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"...);
Lub możesz określić w czasie kompilacji ścieżkę narzędzi POSIX, które chcesz uruchomić (pamiętając, że w niektórych systemach, takich jak GNU, potrzebujesz więcej kroków, takich jak ustawienie POSIXLY_CORRECT
zmiennej w celu zapewnienia zgodności).
Możesz także spróbować takich rzeczy jak:
execlp("sh", "sh", "-c", "PATH=`getconf PATH`${PATH+:$PATH};export PATH;"
"unset IFS;shift \"$1\";"
"exec ${1+\"$@\"}", "2", "1", "ps", "-A"...);
W nadziei, że to sh
się $PATH
, że jest podobny do Bourne, że istnieje również getconf
i to, że jest to jedna z wersji POSIX jesteś zainteresowany.
/bin
, tj./bin/ed
Muszą być użyteczne jeśli ed jest zainstalowany. Nie mogę go teraz znaleźć, ale wiem, że LSB zależy od tego, i skutecznie broniłem raportów o błędach, używając tego jako uzasadnienia, więc przynajmniej w pewnym momencie musiało to być prawdą. (Lub było to coś innego niż POSuX i źle pamiętam, ale reszta jest prawdą.)