Ich vermute, das ist der Teil der Sequenz, der dich fängt:
Die Wörter, die keine Variablenzuweisungen oder Umleitungen sind, werden erweitert (siehe Shell-Erweiterungen). Wenn nach der Erweiterung noch Wörter übrig sind, wird das erste Wort als Name des Befehls verwendet, und die verbleibenden Wörter sind die Argumente
Dies stammt aus dem Bash-Referenzhandbuch im Abschnitt über die einfache Befehlserweiterung.
In diesem cmd=bash
Beispiel werden keine Umgebungsvariablen festgelegt, und bash verarbeitet die Befehlszeile durch Parametererweiterung bash -c "echo hi"
.
In diesem prefix=hello=hi
Beispiel gibt es im ersten Durchgang wieder keine Variablenzuweisungen, sodass die Verarbeitung mit der Parametererweiterung fortgesetzt wird, was zu einem ersten Wort von führt hello=hi
.
Sobald die Variablenzuweisungen verarbeitet wurden, werden sie während der Befehlsausführung nicht erneut verarbeitet.
Siehe die Verarbeitung und ihre Ergebnisse unter set -x
:
$ prefix=hello=hi
+ prefix=hello=hi
$ $prefix bash -c 'echo $hello'
+ hello=hi bash -c 'echo $hello'
-bash: hello=hi: command not found
$ hello=42 bash -c 'echo $hello'
+ hello=42
+ bash -c 'echo $hello'
42
eval
Betrachten Sieenv
für eine sicherere Variante der "Variablenerweiterung" als "Umgebungsvariablen" den Vorschlag von wjandrea :
prefix=hello=hi
env "$prefix" bash -c 'echo "$hello"'
hi
Es handelt sich nicht ausschließlich um eine Zuweisung von Befehlszeilenvariablen, da wir die env
Hauptfunktion des Dienstprogramms zum Zuweisen von Umgebungsvariablen zu einem Befehl verwenden, aber das gleiche Ziel erreicht. Die $prefix
Variable wird während der Verarbeitung der Befehlszeile erweitert und gibt den Namen = Wert an env
, an den sie weitergegeben wird bash
.
env
stattdessen verwendeneval
, welches IIRC sicherer, aber langsamer ist.