Змінні оболонки проти змінних середовища
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. Отже, якщо ви хочете запам'ятати просте правило, просто завжди використовуйте подвійні лапки навколо змінних підстановок.