Sospetto che questa sia la parte della sequenza che ti sta catturando:
Le parole che non sono assegnazioni variabili o reindirizzamenti vengono espanse (vedere Espansioni della shell). Se dopo l'espansione rimangono delle parole, la prima parola viene considerata il nome del comando e le parole rimanenti sono gli argomenti
Questo è tratto dal manuale di riferimento di Bash nella sezione sull'espansione dei comandi semplici.
Nel cmd=bash
esempio, non variabili di ambiente sono impostate, e bash processi linea di comando attraverso l'espansione dei parametri, lasciando bash -c "echo hi"
.
Nel prefix=hello=hi
esempio, ci sono ancora assegnazioni non variabili nel primo passaggio, quindi l'elaborazione continua ad espansione di parametro, risultando in una prima parola di hello=hi
.
Una volta che le assegnazioni delle variabili sono state elaborate, non vengono rielaborate durante l'esecuzione del comando.
Vedi l'elaborazione e i suoi risultati sotto 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
Per una variazione più sicura di "espansione variabile" -come- "variabili d'ambiente" rispetto a eval
, si consideri il suggerimento di wjandrea dienv
:
prefix=hello=hi
env "$prefix" bash -c 'echo "$hello"'
hi
Non è strettamente un'assegnazione di variabili da riga di comando, poiché stiamo usando la env
funzione principale dell'utilità di assegnare variabili di ambiente a un comando, ma raggiunge lo stesso obiettivo. La $prefix
variabile viene espansa durante l'elaborazione della riga di comando, fornendo il nome = valore a env
, a chi la passa bash
.
env
invece dieval
quale IIRC è più sicuro, ma più lento.