Яке значення одиничних та подвійних лапок у змінних середовища?


19

У своєму .profile я визначив деякі змінні середовища так:

MY_HOME="/home/my_user"

але здається, що змінна не оцінює, якщо я не зніму лапки і не поверну файл знову. Я вважаю, що котирування необхідні, якщо пробіли будуть, а одинарні цитати використовуються, якщо не потрібні втечі. Чи може хтось уточнити значення одиничних і подвійних лапок у змінних визначеннях? Як щодо фронтових кліщів та задніх кліщів?

Відповіді:


23

Думаю, ти розгублений у термінології.

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

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

MY_HOME="/home/my_user"
export MY_HOME

ставить змінну з назвою "MY_HOME" майже у всіх оболонках (csh, tcsh виключено).

У цьому конкретному випадку подвійні лапки є зайвими. Вони не мають ефекту. Подвійні котирування групових підрядів, але дозволяє будь-якій оболонці ви використовуєте змінну підстановку. Одно цитування груп підрядів і запобігає їх заміні. Оскільки ваш приклад призначення не містить змінних у ньому, подвійні лапки можуть з'явитися як одноцитати.

V='some substrings grouped together'  # assignment
X="Put $V to make a longer string"    # substitution and then assignment
Y=`date`                              # run command, assign its output
Z='Put $V to make a longer string'    # no substition, simple assignment

Нічого не існує в середовищі, поки ви не експортуєте його.


18

Змінні оболонки проти змінних середовища

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


Поясніть, будь ласка, "Цитування здебільшого ортогональне". у розділі "Про котирування"? Я не знаю ортогонального значення в цьому реченні.
ДК Босе

1
@DKBose Це означає, що змінні середовища та оболонки з одного боку, а цитування - з іншого боку, є двома окремими проблемами, які мають мало спільного між собою. Вікісховище значення 4 і 5.
Жил "SO - перестань бути злим"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.