Змінна середовища щодо змінної 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.