7

От 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
[...]

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

4 ответа4

6

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

1

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

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

  2. Запустите их в одну строку, но с точкой с запятой между ними. то есть: foo=bar; echo $foo

  3. То же, что № 2, но с двойными амперсандами. то есть: foo=bar && echo $foo

Разница между 2 и 3 состоит в том, что 3 выполнит echo $foo случае foo=bar .

0

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

foo=bar sh -c 'echo $foo'
0

Пытаться:

foo=bar; echo $foo
       ^

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .