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