Mit dem Befehl in Ihrem Beispiel echo
wird ausgeführt, aber was passiert, $APPLE
ist etwas komplizierter.
Es ist wahr, wie in der Antwort von @ Patrick hier angegeben, dass, wenn die Shell einen Prozess aufruft, alle Variablen, die in der Befehlszeile vor ihrem Aufruf deklariert wurden, angegeben werden, um in ihre Umgebung exportiert zu werden. Außerdem werden diese Variablen so angegeben, dass sie mit dem aufgerufenen Prozess ablaufen - also ...
unset var; var=val cmd; echo ${var-unset.}
... sollte drucken unset.
Aber wo dieses ganze Konzept etwas komplizierter wird und wie Ihr eigenes Beispiel zeigt, ist es an dem Punkt, an dem cmd
es sich nicht um einen aufgerufenen Prozess handelt, sondern entweder um ein Shell-Builtin, eine Shell-Funktion oder ein spezielles Shell-Builtin-Dienstprogramm. In jedem dieser drei Fälle führt die Shell höchstwahrscheinlich nur einige ihrer eigenen Routinen im Speicher aus und ruft überhaupt nichts auf.
Zum Beispiel echo
ist es fast definitiv ein Shell-eingebautes Dienstprogramm - wie die meisten mir bekannten Shells es als solches bereitstellen -, aber es ist kein POSIX-spezifiziertes spezielles eingebautes Dienstprogramm. Auf diese Weise ist es im Grunde eine Shell-Funktion, die eine externe ausführbare Datei emulieren muss. Dies wird hier wahrscheinlich etwas deutlicher ausgedrückt:
Der Begriff "integriert" impliziert, dass die Shell das Dienstprogramm direkt ausführen kann und nicht danach suchen muss. Eine Implementierung kann sich dafür entscheiden, jedes Dienstprogramm zu einem integrierten Dienstprogramm zu machen. Die hier beschriebenen speziellen integrierten Dienstprogramme unterscheiden sich jedoch von den regulären integrierten Dienstprogrammen ...
Mit speziellen integrierten Dienstprogrammen angegebene Variablenzuweisungen bleiben auch nach Abschluss des integrierten Dienstprogramms wirksam. Dies ist bei einem regulären eingebauten oder anderen Dienstprogramm nicht der Fall.
Die speziellen integrierten Dienstprogramme in diesem Abschnitt müssen nicht auf eine Weise bereitgestellt werden, auf die über die im System Interfaces-Volume von POSIX.1-2008 definierte exec-Funktionsfamilie zugegriffen werden kann.
Eine in echo
der Befehlszeile deklarierte Variable geht also verloren echo
, aber eine in set
der Befehlszeile deklarierte Variable bleibt bestehen - obwohl sie bash
standardmäßig gegen diese Regel verstößt) . Gleiches gilt, wenn cmd
es sich um eine Shell- Funktion handelt :
Wenn eine Funktion ausgeführt wird, muss sie die Eigenschaften für Syntaxfehler und Variablenzuweisung aufweisen, die für spezielle integrierte Dienstprogramme in der Aufzählungsliste am Anfang der speziellen integrierten Dienstprogramme beschrieben sind.
sh
die Einhaltung des Standards vorschreibt, gibt es nicht an, welcher Pfadsh
vorhanden sein muss. Dies/bin/sh
ist nicht unbedingt die POSIX-Shell und auf einigen Plattformen (heutzutage im Wesentlichen Solaris 10 und älter) die alte Bourne-Shell. Dies wird in diesem speziellen Fall der Variablenzuweisung nicht schaden, da diese Syntax lange vor dem POSIX-Standard liegt.