Відповіді:
$BASH
- локальна змінна, яка діє лише в поточній оболонці (bash).
Змінні середовища, такі як $SHELL
дійсні в усьому світі. У поточній оболонці Bash $BASH
вказує шлях виконання bash , тоді як $SHELL
вказує на оболонку, визначену за замовчуванням (яка може мати однакове значення).
Для пояснення змінних середовища див. Змінні середовища у довідці Ubuntu.
Змінна середовища є глобально доступною у програмі та програмі-дочірніх програмах. Змінна оболонки доступна лише в поточній оболонці. Щоб зробити змінну оболонки доступною як змінну середовища, використовуйте 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 / ...
export
встановлює змінну середовища для дочірніх процесів. Повідомлення, яке ви пов’язали, не суперечить цій відповіді. Чи можете ви пояснити, чому ви вважаєте, що це неправильно?
export
абсолютно встановити змінну середовища
Є різниця. Змінні оболонки та змінні середовища пояснять це краще, ніж я можу, але ось уривок із цього:
Якщо зміна змінної оболонки внесена, її потрібно явно "експортувати" у відповідну змінну середовища, щоб будь-які роздвоєні підпроцеси бачили зміни. Нагадаємо, що змінні оболонки є локальними для оболонки, в якій вони були визначені.
Змінна оболонки: Короткочасна, застосовується лише до поточного екземпляра оболонки, Не застосовується для системи
Екологічна змінна: тривале використання, діюча система широка, дозволена в усьому світі
За умовами Shell Variable мають свою назву як малі регістри, а Envn. Змінні записуються як великі регістри
Щоб відповісти на це запитання, спершу спробуйте зрозуміти область змінної.
Коли ви створюєте нову змінну, як 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).