Змінні оболонки проти змінних середовища
MY_HOME="/home/my_user"
встановлює названу змінну оболонкиMY_HOME
. Оболонки є мовами програмування та мають змінні (також їх називають параметрами). Після цього призначення ви можете використовувати значення змінної, наприклад, з echo "$MY_HOME"
.
Змінні оболонки - це внутрішня концепція оболонки. Коли цей екземпляр оболонки припиняється, MY_HOME
це забуто. Те, що кожна програма знає і передає своїм дітям, - це змінні середовища .
Всередині оболонки змінні середовища і змінні оболонки працюють дуже схожими способами. Що насправді відбувається, так це те, що всі змінні середовища, які оболонка успадковує від свого батьківського, стають змінними оболонок. І навпаки, змінна оболонки, визначена в сценарії оболонки, стане змінною середовища, якщо експортувати її.
export MY_HOME="/home/my_user"
Більше деталей можна пропустити під час першого читання
Причина, через яку змінні оболонки автоматично не стають змінними середовища, полягає в тому, що скрипт може випадково використовувати ім’я змінної, що має значення для програми, яку вона запускає, і частково просто історичної.
Деякі дуже старі оболонки, які потрібно export
використовувати щоразу, коли ви змінюєте ім'я змінної, але всі сучасні оболонки відслідковують призначення змінних середовища, так що наступний фрагмент повторюється bar
:
myvar=foo
export myvar
myvar=bar
env | grep '^myvar='
Крім того, для деяких дуже старих оболонок потрібні окремі команди для myvar=foo
і export myvar
, але всі сучасні оболонки розуміють export myvar=foo
.
Ви можете запустити, set -a
щоб усі присвоєння змінної оболонки автоматично експортували змінну, так що myvar=foo
це еквівалентно, export myvar=foo
якщо ви вперше запустили set -a
цю оболонку.
Про цитування
Цитування здебільшого ортогональне. Якщо значення, яке ви присвоюєте змінній, не містить жодних символів, які є особливими для оболонки, вам не потрібно жодних лапок. Якщо є спеціальні символи, вам потрібно захистити їх за допомогою одиничних лапок або подвійних лапок чи зворотних нахилів або їх комбінації. Це стосується як простого myvar=value
синтаксису, так і export
утиліти.
Є одна відмінність між синтаксисом призначення і export
синтаксисом. Оболонка додатково розширює результати змінних підстановок $foo
, виконуючи розщеплення поля (слова) та розширення імені шляху (глобулювання) . Це означає, що якщо значення myvar
є hello *
, тоді echo $myvar
виводиться друк з hello
подальшим єдиним пробілом, за яким перелік файлів у поточному каталозі. Це майже ніколи не бажано, тому загальний принцип завжди використовувати подвійні лапки змінної підстановки (якщо ви не знаєте , що вам потрібно PathName розширення або поділу полів): echo "$myvar"
. У разі простого присвоювання, othervar=$myvar
справді надійно копіює значення myvar
вothervar
, оскільки глобус та розщеплення слів затримуються у призначеннях (оскільки вони створюють кілька слів, але очікується одне слово). Однак ця компенсація не стосується export
. Отже, якщо ви хочете запам'ятати просте правило, просто завжди використовуйте подвійні лапки навколо змінних підстановок.