Неожиданное поведение в Bash

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

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

7
задан 27.10.2013, 11:21

3 ответа

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

6
ответ дан 07.12.2019, 15:01

Если Вы делаете 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 следовавший.

1
ответ дан 07.12.2019, 15:01

Попытка:

foo=bar; echo $foo
       ^

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

0
ответ дан 07.12.2019, 15:01

Теги

Похожие вопросы