Podejrzewam, że jest to część sekwencji, która Cię łapie:
Słowa, które nie są przypisaniami ani przekierowaniami zmiennych, są rozwijane (patrz Rozszerzenia powłoki). Jeśli po rozwinięciu pozostaną jakieś słowa, pierwsze słowo jest uznawane za nazwę polecenia, a pozostałe słowa to argumenty
To pochodzi z podręcznika użytkownika Bash w rozdziale Prosta rozbudowa poleceń.
W tym cmd=bashprzykładzie nie ustawiono żadnych zmiennych środowiskowych, a bash przetwarza wiersz poleceń w górę poprzez rozwijanie parametrów, pozostawiając bash -c "echo hi".
W tym prefix=hello=hiprzykładzie ponownie nie ma przypisań zmiennych w pierwszym przejściu, więc przetwarzanie kontynuuje ekspansję parametrów, w wyniku czego powstaje pierwsze słowo hello=hi.
Po przetworzeniu przypisań zmiennych nie są one ponownie przetwarzane podczas wykonywania polecenia.
Zobacz przetwarzanie i jego wyniki w 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
Aby uzyskać bezpieczniejszą odmianę „zmiennych ekspansji” -as- „zmiennych środowiskowych” eval, rozważ sugestię wjandrea dotyczącąenv :
prefix=hello=hi
env "$prefix" bash -c 'echo "$hello"'
hi
Nie jest to ściśle przypisanie zmiennych wiersza poleceń, ponieważ używamy envgłównej funkcji narzędzia do przypisywania zmiennych środowiskowych do polecenia, ale osiąga ten sam cel. $prefixZmienna jest rozszerzona podczas przetwarzania poleceń linii podanie nazwy = wartość env, która przekazuje je wraz z bash.
envzamiast tegoeval, który IIRC jest bezpieczniejszy, ale wolniejszy.