Перемінна оболонка проти змінної середовища, яка з них є кращою, якщо обидва мають однакове ім’я?


10

Введіть у Bash таке:

env | grep USER

і

set | grep USER

дає обом раз однакове ім’я користувача.

Як я можу знати, наприклад, коли набираєте, echo $USERчи відображалася оболонка чи змінна середовища?

Відповіді:


14

Для сумісних з 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

1
Зауважте, що оболонка Bourne, як і csh, ініціалізує змінні оболонки зі змінних середовища. Але зміна змінних оболонок не впливає на відповідну змінну середовища, якщо ви не експортуєте їх. Це те, що було порушено оболонкою Корна (і вказано POSIX). Ось чому вам слід бути обережними з назвою змінних оболонок, якими ви користуєтесь зараз, щоб переконатися, що ви не змінюєте env vars, які можуть впливати на команди, які виконуються у вашому сценарії.
Стефан Шазелас

4

Це одна і та сама змінна. У оболонці, на відміну від більшості інших мов програмування, змінні середовища та змінні оболонки мають однаковий простір імен. У оболонці змінна середовища - це змінна оболонка, яку експортували export.

Дивіться, наприклад, мою відповідь на ваше попереднє запитання " Яка різниця у використанні між змінними оболонки та змінними середовища? "


я перечитаю ваше пояснення, тільки мені спочатку потрібно вивчити деякі речі, перш ніж я зможу зрозуміти вашу відповідь.
акулант

@sharkant Зовсім не хвилюйся. Якщо я плутаю речі, то просто скажіть, і я спробую уточнити. Відповідь ilkkachu також хороша.
Кусалаланда

ні, я не думаю, що у вас є хороший стиль пояснення, це тільки моя відсутність знань не може їх ще дорожити.
акулант

2

Змінна оболонки може використовуватися лише для поточної оболонки, її не можна використовувати в системі. З іншого боку екологічна змінна може бути використана System Wide. Згідно з умовами Shell Variable записуються як малі регістри, тоді як змінна середовища - як великі. Ви можете змусити змінну оболонки працювати як змінну середовища, її просто потрібно експортувати.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.