Является ли это специфичным для bash методом вызова скрипта: VARIABLE = value bash somescript

Я работал всю свою жизнь в оболочке HPUX / ksh, поэтому в наши дни bash бросает новые способы делать много вещей (многие из которых, похоже, не совместимы с POSIX – например, «mkdir -p / root / {abc , Def, ghi, jkl} '- по-видимому, это лучшая практика кодирования в bash / OpenStack, но это совсем другое задание).

В любом случае, я видел такое выполнение скрипта в нескольких местах в коде OpenStack:

ENABLE_VCENTER=true bash /root/stack_install.sh 

Может кто-нибудь объяснить, как это работает? Я знаю, что оболочка установит переменную, а затем вызовет сценарий оболочки (что объясняет классическую ошибку nooB, почему назначение переменной не должно быть с пробелами, например HELLO = world). Но что именно происходит внутри страны?

Кроме того, почему это не работает для меня, когда я пытаюсь выполнить эту команду:

 HELLO=world echo $HELLO 

Я получаю следующий вывод из оболочки:

 [ ubuntuOne : /home/bumblebee ] > HELLO=world echo $HELLO [ ubuntuOne : /home/bumblebee ] > 

Что мне здесь не хватает?

Спасибо за ваши ответы.

 HELLO=world echo $HELLO 

В приведенном выше bash выполняет расширение параметра до выполнения оператора. Это означает, что $HELLO заменяется ничем (или каким бы то ни было текущим значением HELLO) до выполнения оператора (что будет включать настройку HELLO для world ).

Заметим:

 $ HELLO=world bash -c 'echo $HELLO' world 

Обратите внимание, что echo $HELLO находится внутри одинарных кавычек. Одиночные кавычки предотвращают расширение параметров. Это означает, что HELLO не оценивается до запуска bash subshell и рассматривает его как аргумент. К тому времени HELLO будет установлен равным world .

Напротив, рассмотрим эту строку, в которой одинарные кавычки были заменены двойными кавычками:

 $ HELLO=world bash -c "echo $HELLO" 

Здесь ничего не печатается, потому что двойные кавычки не подавляют расширение параметра. Таким образом, команде bash даются два аргумента -c и echo . Следовательно, ничего не печатает.

Все подробности

man bash подробно объясняет, что происходит, когда обрабатываются команды, такие как выше:

Когда выполняется простая команда, оболочка выполняет следующие расширения, назначения и перенаправления слева направо.

  1. The words that the parser has marked as variable assignments (those preceding the command name) and redirections are saved for later processing. 2. The words that are not variable assignments or redi‐ rections are expanded. 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. 3. Redirections are performed as described above under REDIRECTION. 4. The text after the = in each variable assignment undergoes tilde expansion, parameter expansion, com‐ mand substitution, arithmetic expansion, and quote removal before being assigned to the variable. 

Рассмотрим снова команду:

 HELLO=world echo $HELLO 

Аргумент для echo подвергается расширению параметра на шаге 2, в то время как bash даже не начинает присваивать новое значение HELLO до шага 4.

  • Запустите сценарий в OS X 10.6 при сетевом подключении. (Например, /etc/network/if-up.d/)
  • Странное поведение strace и setuid: разрешение отклонено под strace, но не работает нормально
  • Как запустить команду / скрипт оболочки при вводе / cd-в каталоге на Snow Leopard?
  • Как заменить часть текстового файла между маркерами на другой текстовый файл?
  • Сценарий оболочки для исправления неправильных имен файлов?
  • Зацикливание результатов `ls` в скрипте оболочки bash
  • Экран Gnu: выполнить команду при подключении
  • На OS X, как я могу запустить Cacoa emacs * и * перенести его на передний план?
  • Обработка пробелов во имя набора данных ZFS в сценарии оболочки
  • С скриптом оболочки, можно сказать, когда он запускается с помощью cron vs run вручную?
  • Как авто исходный сценарий оболочки?
  • Давайте будем гением компьютера.