При использовании того, LANG=C gcc ...
что происходит , является то, что оболочка устанавливает LANG для gcc
окружающей среды «S только и не для текущей самой среды ( смотрите примечание ). Таким образом, после gcc
завершения LANG
возвращается к своему предыдущему значению (или не установлено).
Кроме того, при использовании A=10 echo $A
именно оболочка заменяет $ A, а не echo, и эта подстановка (называемая «расширением») происходит до того, как вычисляется оператор (включая присвоение), поэтому для работы с ожидаемым A
значением должно быть уже установлено в нынешних условиях до этого заявления.
Вот почему A=10 echo $A
не работает должным образом: A=10
будет установлено для echo, но echo внутренне игнорирует значение переменной окружения A
. И $A
заменяется значением, установленным в текущей оболочке (которого нет), а затем передается в качестве аргумента echo.
Так что ваше предположение верно: VAR=value command
делает работу, но это имеет значение только если command
внутренне использует УАК. Если нет, то вы можете передать в value
качестве аргумента к 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
И последнее, но не менее важное: стоит знать разницу между переменными оболочки и среды и аргументами программы .
Вот несколько хороших ссылок:
,
(*) Примечание: технически оболочка также устанавливается в текущей среде, и вот почему: некоторые команды, такие как echo
, read
и test
являются встроенными в оболочку , и поэтому они не порождают дочерний процесс. Они бегут в текущей среде. Но оболочка заботится о назначении только до тех пор, пока команда не будет запущена, поэтому для всех практических целей эффект тот же: назначение видится только этой единственной командой.
A=10 (echo $A)
и получить10
?