Неожиданное поведение в Баш

От man bash:

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

Так что совершенно законно написать:

foo=bar echo $foo

но он не работает, как я ожидаю (он печатает только новую строку). Это довольно странно для меня, так как:

$ foo=bar printenv
foo=bar
TERM=rxvt-unicode
[...]

Может кто-нибудь объяснить мне, где я делаю неправильно?

4 ответа

Решение

Это происходит потому, что расширение переменной выполняется до запуска команды. В то время, когда происходит расширение переменной, foo не установлен, поэтому он расширяется до пустой строки. Затем команда запускается, установив foo,

Если вы делаете foo=bar а также echo $foo на одной линии это не сработает. Вам придется сделать одну из трех вещей.

  1. Запустите их как отдельные команды. то есть: foo=bar Войти echo $foo

  2. Run them on one line, but with a semicolon between the two. то есть: foo=bar; echo $foo

  3. Same as #2, but with double-ampersands. то есть: foo=bar && echo $foo

The difference between 2 and 3 is that 3 will only execute echo $foo если foo=bar удалось.

Правильный способ сделать это будет:

foo=bar sh -c 'echo $foo'

Пытаться:

foo=bar; echo $foo
       ^

Следите за ; так как вы пытаетесь разместить две отдельные команды в одной строке. По умолчанию они не работают вместе.

Другие вопросы по тегам