Non, ce n'est pas le cas, principalement parce qu'il n'exige pas que les systèmes soient conformes par défaut , ou uniquement à la norme POSIX (à l'exclusion de toute autre norme).
Par exemple, Solaris (un système conforme certifié) a choisi la compatibilité descendante pour ses utilitaires dans /bin
, ce qui explique pourquoi ceux-ci se comportent de manière mystérieuse, et fournissent des utilitaires conformes POSIX dans des emplacements distincts ( /usr/xpg4/bin
, /usr/xpg6/bin
... pour différentes versions de XPG (maintenant fusionnées) en POSIX) standard, ceux-ci faisant en fait partie des composants optionnels de Solaris).
Même sh
n'est pas garanti d'être en/bin
. Sous Solaris, /bin/sh
était le shell Bourne (donc pas compatible POSIX) jusqu'à Solaris 10, alors qu'il est maintenant ksh93 dans Solaris 11 (toujours pas entièrement compatible POSIX, mais en pratique plus que /usr/xpg4/bin/sh
).
De C, vous pouvez utiliser exec*p()
et supposer que vous êtes dans un environnement POSIX (en particulier en ce qui concerne la PATH
variable d'environnement).
Vous pouvez également définir la PATH
variable d'environnement
#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"...);
Ou vous pouvez déterminer au moment de la construction le chemin des utilitaires POSIX que vous souhaitez exécuter (en gardant à l'esprit que sur certains systèmes comme GNU, vous avez besoin de plus d'étapes comme définir un POSIXLY_CORRECT
variable pour garantir la conformité).
Vous pouvez également essayer des choses comme:
execlp("sh", "sh", "-c", "PATH=`getconf PATH`${PATH+:$PATH};export PATH;"
"unset IFS;shift \"$1\";"
"exec ${1+\"$@\"}", "2", "1", "ps", "-A"...);
Dans l'espoir qu'il y ait un sh
in $PATH
, qu'il ressemble à Bourne, qu'il y en ait aussi un getconf
et que c'est celui de la version de POSIX qui vous intéresse.
/bin
, c'est-à-dire qu'elles/bin/ed
doivent être utilisables si ed est installé. Je ne le trouve pas pour le moment, mais je sais que LSB en dépend, et j'ai réussi à défendre les rapports de bogues en utilisant cela comme justification, donc cela doit au moins être vrai à un moment donné. (Ou c'était autre chose que POSuX et je me souviens mal, mais le reste est vrai.)