От man bash
:
A simple command is a sequence of optional variable assignments followed by blank-separated words and redirections, and terminated by a control operator. The first word specifies the command to be executed, and is passed as argument zero. The remaining words are passed as arguments to the invoked command.
Так что совершенно законно написать:
foo=bar echo $foo
но он не работает, как я ожидаю (он печатает только новую строку). Это довольно странно для меня, так как:
$ foo=bar printenv
foo=bar
TERM=rxvt-unicode
[...]
Может кто-нибудь объяснить мне, где я делаю неправильно?
foo=bar eval 'echo eval sees $foo'; echo echo sees $foo
(здесь, так как$foo
расширяется в пределахeval
команда, значение будут быть заменен там, но не для следующей команды эха).echo
в оригинальном вопросе илиeval
в примере Гордона). Переменные в дочерней среде не влияют на значения переменных в родительской среде.foo=bar eval 'foo=$foo'; echo $foo
выводит только перевод строки.man bash
: "Если имя команды не появляется, назначения переменных влияют на текущую среду оболочки. В противном случае переменные добавляются в среду выполняемой команды и не влияют на текущую среду оболочки. Если какое-либо из назначений пытается присвоить значение переменная только для чтения, возникает ошибка, и команда завершается с ненулевым статусом. "Если вы делаете
foo=bar
а такжеecho $foo
на одной линии это не сработает. Вам придется сделать одну из трех вещей.Запустите их как отдельные команды. то есть:
foo=bar
Войтиecho $foo
Запустите их в одну строку, но с запятой между ними. то есть:
foo=bar; echo $foo
То же, что № 2, но с двойными амперсандами. то есть:
foo=bar && echo $foo
Разница между 2 и 3 в том, что 3 будет выполнять только
echo $foo
еслиfoo=bar
удалось.источник
Пытаться:
Следите за
;
так как вы пытаетесь разместить две отдельные команды в одной строке. По умолчанию они не работают вместе.источник
Правильный способ сделать это будет:
источник