При использовании того, 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?