Почему & ldquo; A = 10 echo $ A & rdquo; не печатать 10?

Попробуйте добавить параметр -y к apt-get, но знаете, что он ответит на y все запросы.

1
задан 29 May 2014 в 15:48

2 ответа

Когда вы используете LANG=C gcc ..., происходит то, что оболочка устанавливает LANG только для среды gcc, а не для самой текущей среды (см. примечание). Таким образом, после окончания gcc, LANG возвращается к своему предыдущему значению (или не задан).

Кроме того, когда вы используете A=10 echo $A, это только , который заменяет $ A, а не echo, и эта подстановка (называемая «расширение») происходит до того, как оператор будет оценен (включая назначение), поэтому для работы, как ожидалось, значение A должно быть уже установлено в не [!d2 ] перед этим утверждением.

Вот почему A=10 echo $A работает не так, как ожидалось: A=10 будет установлен для эха, но echo внутренне игнорирует значение переменной среды A. И $A заменяется значением, установленным в перед (которое равно none), а затем передается как аргумент для эха.

Итак, ваше предположение верно: , тогда работает, но это актуально только в том случае, если command внутренне использует VAR. Если нет, вы можете передать value в качестве current в command, но аргументы заменяются текущей оболочкой, поэтому они должны быть установлены до использования: VAR=value; command "$VAR"

Если вы знаете, как создать исполняемый скрипт, вы можете попробовать это как тест:

#!/bin/sh
echo "1st argument is $1"
echo "A is $A"

Сохраните его как testscript и попробуйте:

$ A=5; A=10 testscript "$A"; echo "$A"
1st argument is 5
A is 10
5

И последнее, но не менее важное: стоит знать, что разница между использует и переменные среды и программу current .

Вот несколько хороших ссылок:

Как читать и устанавливать переменные среды и оболочки на Linux VPS. Понимание оболочек Unix и переменных среды

. [!d31 ]

(*) Примечание: технически среда оболочки также установлена ​​в текущей среде, и вот почему: Некоторые команды, такие как echo, read и test, являются оболочками, и поэтому они не порождают дочерний процесс. Они работают в текущей среде. Но оболочка заботится о том, чтобы назначение выполнялось только до тех пор, пока команда не будет запущена, поэтому для всех практических целей эффект будет таким же: присваивание рассматривается только одной командой.

36
ответ дан 24 May 2018 в 07:15
  • 1
    Это объяснение на самом деле неверно, хотя оно приводит к правильному выводу во всех случаях, кроме нескольких угловых случаев. Реальное объяснение - это порядок расширения: $A оценивается до назначения. Я думаю, что ваше объяснение только терпит неудачу в случае регулярных встроенных утилит, поведение которых зависит от значения переменной: встроенный видит указанное значение. Общим примером является IFS=: read one two three rest, который читает поля, разделенные двоеточиями: встроенный read видит значение IFS. – Gilles 29 May 2014 в 06:03
  • 2
    «Не для текущей оболочки» неверно: переменная задана в текущей оболочке, но она длится только для текущей простой команды. echo увидит значение 10 для A, если он заботится. – Gilles 30 May 2014 в 23:46
  • 3
    @Gilles: Большое спасибо за разъяснение! Я не знал об этой тонкости. Итак, если я правильно понял, bash имеет для установки current среды, иначе builtins (которые не порождают новый pid), не будут видеть назначение как другое & Quot; regurlar & Quot; команды будут. Но это unsets после выполнения команды для ограничения области назначения. Правильно ли, я исправлю свой ответ. PS: технические аспекты в стороне, я все же думаю, что ответ должен подчеркнуть сферу охвата, а не порядок оценки, иначе можно было бы подумать, что A=10 test; echo $A напечатает 10 – MestreLion 1 June 2014 в 17:31

Один из возможных способов сделать то, что вы, по-видимому, хотите, состоит в том, чтобы выдать команду:

A=10 eval 'echo $A'

, которая фактически отложит замену значения 10 на место $ A на более поздний контекст (т. е. «внутри» eval, который уже знает о назначении). Обратите внимание, что одинарные кавычки необходимы. Такая конструкция четко связывает назначение с желаемой командой (эхо в этом случае), не рискуя загрязнить текущую среду.

2
ответ дан 24 May 2018 в 07:15

Другие вопросы по тегам:

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