Gibt es einen Standard, der die Portabilität der Ausführung eines Befehls nach einer Variablenzuweisung in derselben Zeile abdeckt?
APPLE="cider" echo hi
Wie tragbar ist so etwas? Wo wird es funktionieren und wo nicht?
Außerdem:Meine Shell-Skripte beginnen mit #!/bin/sh, falls das einen Unterschied macht.
Akzeptierte Antwort:
Solange Sie eine POSIX-kompatible Shell verwenden, ja.
Aus der POSIX-Definition der Shell-Befehlssprache:(relevante Punkte in Fettdruck)
Ein „einfacher Befehl“ ist eine Folge von optionalen Variablenzuweisungen und Umleitungen, in beliebiger Reihenfolge, optional gefolgt von Wörtern und Umleitungen, beendet durch einen Kontrolloperator.
Wenn ein gegebener einfacher Befehl ausgeführt werden muss (d. h. wenn ein bedingtes Konstrukt wie eine UND-ODER-Liste oder eine Case-Anweisung den einfachen Befehl nicht umgangen hat), müssen die folgenden Erweiterungen, Zuweisungen und Umleitungen alle ausgeführt werden vom Anfang des Befehlstextes bis zum Ende:
-
Die Wörter, die als Variablenzuweisungen erkannt werden oder Umleitungen gemäß Shell-Grammatikregeln werden für die Verarbeitung in den Schritten 3 und 4 gespeichert.
-
Die Wörter, die keine variablen Zuweisungen oder Umleitungen sind, werden erweitert. Wenn nach ihrer Erweiterung Felder übrig bleiben, gilt das erste Feld als Befehlsname und die restlichen Felder sind die Argumente für den Befehl.
-
Umleitungen müssen wie in Umleitung beschrieben durchgeführt werden.
-
Jede Variablenzuweisung muss vor der Zuweisung des Werts um Tildeerweiterung, Parametererweiterung, Befehlsersetzung, arithmetische Erweiterung und Entfernung von Anführungszeichen erweitert werden.
In der vorstehenden Liste kann die Reihenfolge der Schritte 3 und 4 für die Verarbeitung spezieller integrierter Dienstprogramme umgekehrt werden; siehe Spezielle integrierte Dienstprogramme.
Wenn kein Befehlsname resultiert, sollen Variablenzuweisungen die aktuelle Ausführungsumgebung beeinflussen. Andernfalls werden die Variablenzuweisungen für die Ausführungsumgebung des Befehls exportiert und wirken sich nicht auf die aktuelle Ausführungsumgebung aus (außer bei speziellen Einbauten).
Auch ja #!/bin/sh
Angelegenheiten. Aus der POSIX-Definition von sh
:
Das Dienstprogramm sh ist ein Befehlsspracheninterpreter, der Befehle ausführen soll, die aus einer Befehlszeilenzeichenfolge, der Standardeingabe oder einer angegebenen Datei gelesen werden. Die Anwendung muss sicherstellen, dass die auszuführenden Befehle in der in Shell Command Language beschriebenen Sprache ausgedrückt werden .
Also im Grunde sagt es, dass sh
müssen die oben genannten Regeln befolgen.
Solange Sie sich also auf einem POSIX-kompatiblen Betriebssystem befinden, ist alles in Ordnung.