Відповіді:
Для сумісних з POSIX оболонок (включаючи Bash) стандарт говорить:
2.5.3 Змінні оболонки Змінні
змінної оболонки повинні бути ініціалізовані з оточення [...] Якщо змінна ініціалізується із зовнішнього середовища, її слід негайно позначити для експорту; дивіться спеціальний вбудований експорт. Нові змінні можна визначити та ініціалізувати із призначенням змінних, [тощо]
І про export
:
export name[=word]...
Оболонка повинна надавати атрибут експорту змінним, що відповідають вказаним іменам, що спричиняє їх перебування в середовищі згодом виконаних команд.
Отже, з точки зору оболонки, є лише змінні. Деякі з них, можливо, надходили з середовища, коли оболонка була запущена, а деякі з них можуть бути експортовані до середовища процесів, в яких оболонка починається.
("Навколишнє середовище" - це справді купа струн, переданих в процес під час його запуску. Коли процес запущений, він може робити все, що завгодно, з цим, використовувати його, ігнорувати, перезаписати. І що процес передає далі коли запуск інших процесів може бути іншою справою, хоча, звичайно, зазвичай просто знову передавати всі змінні середовища.)
Якщо ви використовували якусь не-POSIX оболонку, наприклад csh
, речі можуть бути інакшими:
$ csh
% echo $foo
foo: Undefined variable.
% setenv foo bar
% echo $foo
bar
% set foo=asdf
% echo $foo
asdf
% env |grep foo
foo=bar
% exit
Це одна і та сама змінна. У оболонці, на відміну від більшості інших мов програмування, змінні середовища та змінні оболонки мають однаковий простір імен. У оболонці змінна середовища - це змінна оболонка, яку експортували export
.
Дивіться, наприклад, мою відповідь на ваше попереднє запитання " Яка різниця у використанні між змінними оболонки та змінними середовища? "
Змінна оболонки може використовуватися лише для поточної оболонки, її не можна використовувати в системі. З іншого боку екологічна змінна може бути використана System Wide. Згідно з умовами Shell Variable записуються як малі регістри, тоді як змінна середовища - як великі. Ви можете змусити змінну оболонки працювати як змінну середовища, її просто потрібно експортувати.