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=bashBeispiel werden keine Umgebungsvariablen festgelegt, und bash verarbeitet die Befehlszeile durch Parametererweiterung bash -c "echo hi".
In diesem prefix=hello=hiBeispiel 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
evalBetrachten 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 envHauptfunktion des Dienstprogramms zum Zuweisen von Umgebungsvariablen zu einem Befehl verwenden, aber das gleiche Ziel erreicht. Die $prefixVariable wird während der Verarbeitung der Befehlszeile erweitert und gibt den Namen = Wert an env, an den sie weitergegeben wird bash.
envstattdessen verwendeneval, welches IIRC sicherer, aber langsamer ist.