Неожиданное поведение в Баш
От man bash
:
Простая команда - это последовательность необязательных присвоений переменных сопровождаемые пробелами слова и перенаправления, и прекращается оператором управления. Первое слово указывает на команда, которая будет выполнена, и передается как нулевой аргумент. оставшиеся слова передаются в качестве аргументов вызываемой команды.
Так что совершенно законно написать:
foo=bar echo $foo
но он не работает, как я ожидаю (он печатает только новую строку). Это довольно странно для меня, так как:
$ foo=bar printenv
foo=bar
TERM=rxvt-unicode
[...]
Может кто-нибудь объяснить мне, где я делаю неправильно?
4 ответа
Это происходит потому, что расширение переменной выполняется до запуска команды. В то время, когда происходит расширение переменной, foo
не установлен, поэтому он расширяется до пустой строки. Затем команда запускается, установив foo
,
Если вы делаете foo=bar
а также echo $foo
на одной линии это не сработает. Вам придется сделать одну из трех вещей.
Запустите их как отдельные команды. то есть:
foo=bar
Войтиecho $foo
Run them on one line, but with a semicolon between the two. то есть:
foo=bar; echo $foo
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
^
Следите за ;
так как вы пытаетесь разместить две отдельные команды в одной строке. По умолчанию они не работают вместе.