Dies ist eine "als ob" -Regel.
Einfach ausgedrückt: Das Verhalten der Shell, wie Benutzer es sehen, sollte sich nicht ändern, wenn eine Implementierung entscheidet, einen externen Standardbefehl auch als integrierte Shell verfügbar zu machen.
Der Kontrast, den ich unter /unix//a/496291/5132 zwischen den Verhaltensweisen der (einerseits) PD Korn-, MirBSD Korn- und Heirloom Bourne-Shells zeigte; (auf der anderen Seite) die Schalen Z, 93 Korn, Bourne Again und Debian Almquist; und (auf der Greifhand) die Watanabe-Muschel hebt dies hervor.
Für die Shells, die nicht printf
als eingebaut haben, führt das Entfernen /usr/bin
von zu PATH
einem printf
Abbruch der Arbeit. Das POSIX-konforme Verhalten, das die Watanabe-Shell im konformen Modus zeigt, führt zum gleichen Ergebnis. Das Verhalten der Shell mit printf
integriertem Befehl ist so, als würde sie einen externen Befehl aufrufen.
Während sich das Verhalten aller nicht konformen Shells nicht ändert, wenn /usr/bin
entfernt wird PATH
, und sie sich nicht so verhalten, als würden sie einen externen Befehl aufrufen.
Was der Standard Ihnen garantieren möchte, ist, dass Shells alle Arten von normalerweise externen Befehlen einbauen können (oder sie als eigene Shell-Funktionen implementieren), und dass Sie mit den eingebauten Funktionen immer noch dasselbe Verhalten erzielen wie Sie mit den externen Befehlen, wenn Sie einstellen PATH
, dass die Befehle nicht gefunden werden. PATH
bleibt Ihr Werkzeug zur Auswahl und Steuerung der Befehle, die Sie aufrufen können.
(Wie unter /unix//a/448799/5132 erläutert , haben die Leute vor Jahren die Persönlichkeit ihres Unix durch Ändern der Einstellungen ausgewählt PATH
.)
Man könnte meinen, dass die Ausführung des Befehls immer funktioniert, unabhängig davon, ob er gefunden PATH
wird oder nicht, in der Tat der Punkt ist, an dem normalerweise externe Befehle eingebaut werden. (Aus diesem Grund hat mein nosh-Toolset printenv
in Version 1.38 einen integrierten Befehl erhalten. Dies ist jedoch keine Shell.)
Der Standard gibt Ihnen jedoch die Garantie, dass Sie für reguläre externe Befehle, die nicht in der Shell ausgeführt werden, dasselbe Verhalten wie für PATH
andere Nicht-Shell-Programme sehen, die die execvpe()
Funktion aufrufen , und dass die Shell dies auf magische Weise nicht kann (scheinbar) normale externe Befehle ausführen, die andere Programme mit denselben nicht finden können PATH
. Alles funktioniert aus Sicht des Benutzers in sich selbst und PATH
ist das Werkzeug zur Steuerung seiner Funktionsweise.
Weitere Lektüre