Почему игнорируется назначение переменной, предшествующее команде?

Почему игнорируется назначение переменной, предшествующее команде?

В справочной странице bash 4.1 указано:(выделено мной)...

Простые команды

Простая команда:последовательность необязательных назначений переменных, за которыми следуют слова, разделенные пробеламии перенаправления, и завершается оператором управления. Первыйсловоуказывает команду, которая должна быть выполнена, и передается как аргумент ноль. Остальные слова передаются как аргументы вызываемой команде.

Проверка версии в моей системе(НЕ исправлено для контузии)...

#  bash --version
GNU bash, version 4.1.0(1)-release (i686-pc-linux-gnu) ...

Однако предшествующее назначение переменных без точек с запятой должно быть способом локализации значений переменных среды только на период выполнения одного вызова команды, но, похоже, этого не происходит...

#  x=123 echo $x; unset x; echo $x
bash: x: unbound variable
#  x=123; echo $x; unset x; echo $x
123
bash: x: unbound variable
#  x=123; echo $x | tr '1' 'a'; unset x; echo $x
a23
bash: x: unbound variable
#  x=123 echo $x | tr '1' 'a'; unset x; echo $x
bash: x: unbound variable
bash: x: unbound variable
#  x="123" echo "$x" | tr '1' 'a'; unset x; echo $x
bash: x: unbound variable
bash: x: unbound variable
#  x="123"; echo "$x" | tr '1' 'a'; unset x; echo $x
a23
bash: x: unbound variable

Решение
Заэтот ответ на другой вопроспохоже, что команда должна намеренно использовать переменные окружения своего родителя и echoне делает этого. Но вызовы оболочки типа bash -cdo ...

x=123 bash -c 'echo $x'; unset x; echo $x
123
bash: x: unbound variable

Ресурсы

решение1

Эта линия

x=123 echo $x

оценивается в следующем порядке:

  1. $xрасширяется до значения xвтекущийоболочка.
  2. Значение xв среде выполняемой команды установлено равным 123
  3. В развернутой командной строке выполняется поиск команды и echoона находится.
  4. echoзапускается в среде, где xустановлено значение 123, и $1устанавливается на то значение, которое xбыло указано на шаге 1.
  5. echoвыводит данные $1на стандартный вывод, но в противном случае игнорирует другие значения в своей среде.

Обратите внимание, что $xаргумент отделен от символа x, который предшествует команде.

Связанный контент