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=bash
przykł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=hi
przykł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 env
głównej funkcji narzędzia do przypisywania zmiennych środowiskowych do polecenia, ale osiąga ten sam cel. $prefix
Zmienna jest rozszerzona podczas przetwarzania poleceń linii podanie nazwy = wartość env
, która przekazuje je wraz z bash
.
env
zamiast tegoeval
, który IIRC jest bezpieczniejszy, ale wolniejszy.