При використанні того, LANG=C gcc ...
що відбувається , є те, що оболонка встановлює LANG для gcc
навколишнього середовища «S тільки і НЕ для поточної самого середовища ( дивіться примітку ). Тож після gcc
закінчення LANG
повертається до попереднього значення (або не встановлено).
Крім того, коли ви використовуєте A=10 echo $A
це оболонка, яка замінює $ A, а не відлуння, і ця заміна (називається "розширення") відбувається до того, як оператор буде оцінено (включаючи призначення), тому для роботи, як очікувалося A
, значення повинно бути вже встановлено в поточному середовищі до цього твердження.
Ось чому A=10 echo $A
це не працює, як очікувалося: A=10
буде встановлено для echo, але echo внутрішньо ігнорує значення змінної середовища A
. І $A
замінюється значенням, встановленим у поточній оболонці (яке немає), а потім передається як аргумент на лунку.
Таким чином, ваше припущення правильне: VAR=value command
чи працює, але це актуально лише у випадку, коли command
внутрішньо використовується VAR. Якщо немає, то ви можете передати в 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
?