web-dev-qa-db-fra.com

Pourquoi POSIX nécessite-t-il certaines coquilles intégrées à une implémentation externe?

De Cette question sur la question de savoir si Imprimerf est intégré à Yash , vient cette réponse qui cite la norme POSIX .

La réponse indique que la séquence de recherche POSIX consiste à trouver une implémentation externe de la commande souhaitée, puis, si la coquille l'a mise en place comme intégré, exécutez l'intégré. (Pour les constructions intégrées qui ne sont pas spéciales intégrées .)

Pourquoi POSIX a-t-il cette obligation d'exister une mise en œuvre externe avant de permettre une exécution d'une implémentation interne?

Il semble ... arbitraire, alors je suis curieux.

22
studog

Ceci est une règle "comme si".

Mettez simplement: le comportement de la coque que les utilisateurs voient qu'il ne faut pas modifier si une implémentation décide de faire une commande externe standard également disponible en tant que shell intégré.

Le contraste que j'ai montré à https://unix.stackexchange.com/a/496291/5132 entre les comportements de (d'une part) le PD korn, mirbsd korn et Heirloom Bourne Shells; (D'autre part), le Z, 93 Korn, Bourne et les coquilles d'Almquist Debian; et (sur la main de préhension), le shell Watanabe met en évidence cela.

Pour les coquilles qui n'ont pas printf sous forme d'intégré, en supprimant /usr/bin À partir de PATH rend une invocation de printf arrêter de travailler. Le comportement correspondant à POSIX, exposé par la coquille Watanabe dans son mode de conformité, provoque le même résultat. Le comportement de la coquille qui a un printf intégré est comme si Invoquant une commande externe.

Alors que le comportement de toutes les coquilles non conformes ne modifia pas si /usr/bin Est retiré de PATH, et ils font pas Se comporter comme s'il invoque une commande externe.

Ce que la norme tente de vous garantir, c'est que les coquillages peuvent construire toutes sortes de commandes normalement externes (ou les implémenter comme ses propres fonctions shell), et vous aurez toujours le même comportement des intégré comme vous l'avez fait Avec les commandes externes si vous ajustez PATH pour arrêter les commandes de l'être trouvée. PATH reste votre outil de sélection et de contrôle des commandes que vous pouvez invoquer.

(Comme expliqué à - https://unix.stackexchange.com/a/448799/5132 , il y a des années, les personnes ont choisi la personnalité de leur Unix en changeant ce qui était sur PATH.)

On pourrait opiner que de faire la commande Toujours fonctionner Quoi que cela puisse être trouvé sur PATH est en fait le point de faire normalement externe Commandes intégrées. (C'est pourquoi mon outil Nosh Josh a juste gagné une commande intégrée printenv dans la version 1.38, en fait. Bien que cela soit pas une coquille.)

Mais la norme vous donne la garantie que vous verrez le même Comportement pour les commandes externes régulières qui ne sont pas activées PATH de la coque comme vous le verrez d'autres Programmes Shell invoquant la fonction execvpe() _ et la coque ne sera pas magiquement capable d'exécuter (apparemment) des commandes externes ordinaires que d'autres programmes ne peuvent pas trouver avec le même PATH. Tout fonctionne de manière autonome du point de vue de l'utilisateur, et PATH est l'outil de contrôle de la manière dont il fonctionne.

En plus de lecture

15
JdeBP

C'est assez absurde et c'est pourquoi aucun shell ne la met en œuvre dans son mode par défaut.

La norme Justification et son illustrant exemple suggère que c'était une tentative bâclée d'avoir un régulier Intégré associé à un chemin, et Laissez l'utilisateur le remplacer par avoir leur propre binaire apparaissent avant cela dans PATH (par exemple, un printf intégré associé à /usr/bin/printf pourrait être remplacé par le /foo/bin/printf commande externe en définissant PATH=/foo/bin:$PATH).

Cependant, la norme n'a pas fini par nécessiter que, mais quelque chose de complètement différent (et aussi inutile et inattendu).

Vous pouvez en savoir plus à ce sujet dans ce domaine Rapport de bogue . Citant du texte accepté final :

De nombreuses implémentations existantes exécutent un intégré régulier sans effectuer une recherche de chemin. Ce comportement ne correspond pas au texte normatif et ne permet pas aux auteurs de script de remplacer les utilitaires intégrés réguliers via un chemin spécialement conçu. De plus, la justification explique que l'intention est de permettre aux auteurs de remplacer intégrées en modifiant le chemin, mais Ce n'est pas ce que dit le texte normatif .

FWIW, je ne pense pas qu'il y ait une coquille de mise en œuvre des exigences révisées du texte accepté, non plus.

13
mosvy