Я подозреваю, что это та часть эпизода, которая вас зацепила:
The words that are not variable assignments or redirections are expanded (see Shell Expansions). If any words remain after expansion, the first word is taken to be the name of the command and the remaining words are the arguments
Это из справочного руководства по Bash в разделе, посвященном расширению простых команд.
В примере cmd=bash
переменные окружения не установлены, и bash обрабатывает командную строку, расширяя параметры, оставляя bash -c "echo hi"
.
В примере prefix=hello=hi
в первом проходе опять нет назначений переменных, поэтому обработка продолжается до раскрытия параметров, в результате чего получается первое слово hello=hi
.
После обработки назначений переменных они не -повторно обрабатываются во время выполнения команды.
См. обработку и ее результаты в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
, рассмотрите предложение wjandrea оenv
:
prefix=hello=hi
env "$prefix" bash -c 'echo "$hello"'
hi
Это не совсем -назначение переменной строки команды, поскольку мы используем основную функцию утилиты env
по назначению переменных окружения команде, но она выполняет ту же цель. Переменная $prefix
расширяется во время обработки строки команды -, предоставляя имя=значение env
, который передает его bash
.