Змінна середовища щодо змінної Shell, яка різниця?


Відповіді:


35

$BASH- локальна змінна, яка діє лише в поточній оболонці (bash).

Змінні середовища, такі як $SHELLдійсні в усьому світі. У поточній оболонці Bash $BASHвказує шлях виконання bash , тоді як $SHELLвказує на оболонку, визначену за замовчуванням (яка може мати однакове значення).

Для пояснення змінних середовища див. Змінні середовища у довідці Ubuntu.


1
Чудове посилання (+1) :)
— Пітер.O

12
Ця відповідь невірна / неточна. Змінні середовища НЕ є глобальними / загальносистемними. Змінні оболонки є приватними для поточно запущеної оболонки, і вони НЕ експортуються (передаються) ні в які дочірні процеси. Змінні середовища експортуються в будь-які дочірні процеси. "MYVAR = приватний; експорт OURVAR = спільний; принтенв" буде повідомляти лише про "OURVAR", оскільки коли оболонка виконує команду printenv, вона експортує OURVAR, але не MYVAR.
— CM

2
+1 до коментаря CM! Я ніколи не чув, щоб різниця пояснювалася так просто і точно !!! Цей коментар повинен бути відповіддю.
— Джессі Вітер Мандрівник

48

Змінна середовища є глобально доступною у програмі та програмі-дочірніх програмах. Змінна оболонки доступна лише в поточній оболонці. Щоб зробити змінну оболонки доступною як змінну середовища, використовуйте export VARNAME(без долара $).

Приклади для уточнення:

$ SOME=VAR # define shell variable $SOME
$ echo $SOME
VAR
$ env | grep SOME # note: no output
$ export SOME # turn $SOME into an environment variable
$ env | grep SOME
SOME=VAR

Ще один спосіб визначення змінної середовища:

$ export ANOTHER=VALUE
$ echo $ANOTHER
VALUE
$ env | grep ANOTHER
ANOTHER=VALUE

Я не думаю, що це правильно. exportне обов'язково встановлює змінну середовища. stackoverflow.com/questions/7411455 / ...
— Кріс Stryczynski

3
@ChrisStryczynski exportвстановлює змінну середовища для дочірніх процесів. Повідомлення, яке ви пов’язали, не суперечить цій відповіді. Чи можете ви пояснити, чому ви вважаєте, що це неправильно?
— Лекенштейн

exportабсолютно встановити змінну середовища
— Девід Тонхофер

9

Є різниця. Змінні оболонки та змінні середовища пояснять це краще, ніж я можу, але ось уривок із цього:

Якщо зміна змінної оболонки внесена, її потрібно явно "експортувати" у відповідну змінну середовища, щоб будь-які роздвоєні підпроцеси бачили зміни. Нагадаємо, що змінні оболонки є локальними для оболонки, в якій вони були визначені.


Я коментую свою власну відповідь .. Мені дуже подобається посилання Help Ubuntu у відповіді Такката ... (це краще, ніж моя)
— Peter.O

3
Плюс ваше посилання більше не працює!

1

Змінна оболонки: Короткочасна, застосовується лише до поточного екземпляра оболонки, Не застосовується для системи

Екологічна змінна: тривале використання, діюча система широка, дозволена в усьому світі

За умовами Shell Variable мають свою назву як малі регістри, а Envn. Змінні записуються як великі регістри


-1

Щоб відповісти на це запитання, спершу спробуйте зрозуміти область змінної.

Коли ви створюєте нову змінну, як SOME_ENV_VARIABLE="testing.txt"вона знаходиться в SHELL scope, це означає, що до неї можна отримати доступ до цього екземпляра оболонки, де користувач увійшов у систему. Коли, наприклад, змінюється екземпляр, ви відкриваєте новий термінал або змінюєте оболонку (наприклад, ви перейти на csh) ви не можете отримати доступ до цієї змінної.

Коли ви експортуєте таку змінну, як export SOME_ENV_VARIABLEця змінна, тепер доступна в середовищі, це означає, що якщо ви зміните оболонку, ви все одно можете отримати доступ до цієї змінної. Давайте спробуємо розібратися з наступним прикладом:

[vishrant@localhost]$ SOME_ENV_VARIABLE="testing.txt" #creating variable in bash shell
[vishrant@localhost]$ echo $SOME_ENV_VARIABLE
testing.txt
[vishrant@localhost]$ export SOME_ENV_VARIABLE #variable now available with environment
[vishrant@localhost]$ env | grep SOME_ENV_VARIABLE
SOME_ENV_VARIABLE=testing.txt
[vishrant@localhost]$ csh #changing shell
[vishrant@localhost ~/shell_scripting]$ echo $SOME_ENV_VARIABLE
testing.txt
[vishrant@localhost ~/shell_scripting]$ exit
exit #returned to parent shell
[vishrant@localhost]$ SOME_SHELL_VARIABLE="hello.txt"
[vishrant@localhost]$ csh
[vishrant@localhost ~/shell_scripting]$ echo $SOME_SHELL_VARIABLE
SOME_SHELL_VARIABLE: Undefined variable.

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

Пам'ятайте, що якщо відкрити новий термінал, ви не зможете отримати доступ до жодної зі змінних, оскільки ви змінюєте цей екземпляр . Для цього слід додати свої змінні .profileабо в .bashrc( або, якщо ви використовуєте bash).

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