Il s'agit d'une règle "comme si".
Autrement dit: le comportement du shell tel que les utilisateurs le voient ne devrait pas changer si une implémentation décide de rendre une commande externe standard également disponible en tant que shell intégré.
Le contraste que j'ai montré sur /unix//a/496291/5132 entre les comportements (d'une part) des obus PD Korn, MirBSD Korn et Heirloom Bourne; (d'autre part) les obus Z, 93 Korn, Bourne Again et Debian Almquist; et (sur la main agrippée) la coque Watanabe le souligne.
Pour les shells qui n'ont pas de printf
fonction intégrée, la suppression /usr/bin
de PATH
fait appel à l' printf
arrêt du fonctionnement. Le comportement conforme POSIX, présenté par le shell Watanabe dans son mode conforme, provoque le même résultat. Le comportement du shell qui a une fonction printf
intégrée est comme s'il appelait une commande externe.
Alors que le comportement de tous les shells non conformes ne change pas s'il /usr/bin
est supprimé de PATH
, et ils ne se comportent pas comme s'ils invoquaient une commande externe.
Ce que la norme essaie de vous garantir, c'est que les shells peuvent intégrer toutes sortes de commandes normalement externes (ou les implémenter comme ses propres fonctions shell), et vous obtiendrez toujours le même comportement des built-ins que vous l'avez fait avec les commandes externes si vous ajustez PATH
pour empêcher la recherche des commandes. PATH
reste votre outil pour sélectionner et contrôler les commandes que vous pouvez invoquer.
(Comme expliqué sur /unix//a/448799/5132 , il y a des années, les gens ont choisi la personnalité de leur Unix en changeant ce qui était allumé PATH
.)
On pourrait penser que le fait de toujours faire fonctionner la commande, qu'elle soit trouvée ou non, PATH
est en fait le point de rendre les commandes normalement externes intégrées. (C'est pourquoi mon jeu d'outils nosh vient de gagner une printenv
commande intégrée dans la version 1.38, en fait. Bien que ce ne soit pas un shell.)
Mais la norme vous donne la garantie que vous verrez le même comportement pour les commandes externes normales qui ne sont pas activées à PATH
partir du shell, comme vous le verrez à partir d'autres programmes non shell appelant la execvpe()
fonction, et le shell ne pourra pas par magie exécuter (apparemment) des commandes externes ordinaires que d'autres programmes ne peuvent pas trouver avec les mêmes PATH
. Tout fonctionne de manière cohérente du point de vue de l'utilisateur et PATH
est l'outil pour contrôler son fonctionnement.
Lectures complémentaires