Що означає експорт PATH = щось: $ PATH означає?


27

Я дуже новачок у Linux, і я помістив таку команду в кінці файлу .profileпід домашню папку:

export PATH="~/.composer/vendor/bin:$PATH"

Я знаю, що проблеми змінних оточуючих середовищ та їх значень трохи знаходяться в Windows, але в цьому випадку я хочу зрозуміти, що робить ця команда, і які її компоненти містять:

  1. Що це за "експортна" фраза на початку? Це експорт даних, які будуть доступні для Bash?

  2. Що таке перше, PATHа що друге $PATH, і навіщо нам потрібно два?


Деякі технічні відмінності між ОС, окрім цього, еквівалентні цьому процесу в Windows: windowsitpro.com/systems-management/…
Двобітовий алхімік

1
"експорт" робить зміни видимими для нових програм, запущених bash.
Thorbjørn Ravn Andersen

1
@ ThorbjørnRavnAndersen: ні, це відбувається, використовуючи ви чи не використовуєте exportкоманду, оскільки PATHзмінна вже позначена як експортована. (Спробуйте обидва способи, якщо ви не повірите мені!)
Девід

Відповіді:


39

Що це за "експортна" фраза на початку?

exportце команда (точніше, це вбудований Bash , тобто це не виконуваний файл PATH, це команда, яку Bash вбудував в себе).

Це експорт даних, які будуть доступні для Bash?

exportвстановлює змінну середовища з лівого боку призначення, значення на правій стороні призначення; така змінна середовище є видимою для процесу, який її встановлює, і для всіх підпроцесів, породжених в одному середовищі, тобто в цьому випадку для екземпляра Bash, який джерела ~/.profileі всіх підпроцесів, породжених в одному середовищі (який може включати, наприклад, також інші оболонки , який, у свою чергу, матиме доступ до нього).

Що таке перше, PATHа що друге $PATH, і навіщо нам потрібно два?

Перший, PATHяк пояснено вище, - це змінна середовище, яку слід встановити за допомогою export.

Оскільки PATHзазвичай міститься щось, коли ~/.profileвоно розміщено (за замовчуванням воно містить /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games), просто встановити, PATHщоб ~/.composer/vendor/binвін PATHмістив лише цей вміст ~/.composer/vendor/bin.

Отже, оскільки посилання на змінну в команді замінюються (або "розширюються" на) значенням змінної на Bash під час оцінки команди , :$PATHставиться в кінці значення, яке присвоюється PATHтак, що в PATHкінцевому підсумку містить ~/.composer/vendor/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games( тобто те, що PATHмістить уже плюс ~/.composer/vendor/bin:на початку).


Страхітливе пояснення.
Choylton B. Higginbottom

16

https://help.ubuntu.com/community/EnvironmentVariables , ймовірно, допоможе вам. Також man bashможе бути дуже корисно зрозуміти, як це працює (принаймні в Bash)

У будь-якому випадку - що стосується PATH=того, що ви в основному встановлюєте PATHзмінну, додаючи нові шляхи для пошуку, додаючи в кінці вже / раніше встановлені шляхи, з $PATH(що в основному є посиланням на PATHзмінну).

Отже, скажіть, що ваш PATHдосі був налаштований на щось на кшталт:

PATH="x:y:z"

і тоді ви встановите

PATH="a:b:c:$PATH"

ваше PATHпісля цього буде таким:

a:b:c:x:y:z

Сподіваюся, це має сенс.

Крім того, ви експортуєте нову змінну, щоб вона була відома у вашому оточенні, включаючи також дочірні процеси / підшарови.

Слід також пам’ятати, що порядок каталогів, встановлений у них, PATHможе мати важливе значення. І щось подібне PATH="$PATH:a:b:c"дасть вам результат:

x:y:z:a:b:c

що вплине на порядок каталогів / шляхів під час пошуку команди (якщо ви маєте команду в декількох із каталогів, буде використано перше знайдене - що може дати вам несподівані результати іноді).


2

Ось така команда, щоб усі могли слідувати, проходячи через точки кулі. export PATH="~/.composer/vendor/bin:$PATH"

  • export/bin/exportкоманда вбудована в оболонку (тобто немає , це оболонка) команда в основному робить змінні середовища доступними для інших програм, викликаних з bash(див. пов'язане питання в додатковому читанні) та підрозділів.
  • Присвоєння оболонці спочатку займе розширення, потім присвоєння відбудеться друге. Тож те, що знаходиться всередині подвійних лапок, спочатку розширюється, а потім зберігається до PATHзмінної.
  • $PATH- це PATHзавдання за замовчуванням (або принаймні те, що схожа змінна, доки ця команда не з’явиться у вашому .bashrcабо .profile), і розгорніть її.
  • ~/.composer/vendor/binзбирається розширитись /home/username/.composer/vendor/bin, де .composerприхована папка завдяки провідній крапці.
  • Це коротке ~/.composer/vendor/bin:$PATHтепер перетворилося на довгий список папок, розділених на :. Все укладено у подвійні лапки, щоб ми включили до них папки з пробілами.
  • Нарешті все зберігається у PATHзмінних та зовнішніх командах, дозволених ним користуватися

Простий приклад

Насправді моя інтерактивна оболонка mksh, яка, можливо , також має exportвбудований. Використовуючи exportдля встановлення VAR, моя змінна може бути передана та використана наступними ланцюжками команд / підпроцесів, куди я експортував цю саму змінну

$ echo $SHELL            
/bin/mksh
$ VAR="HelloAskUbuntu"
$ bash -c 'echo $VAR' 
$ export VAR="HelloAskUbuntu"                                                  
$ bash -c 'echo $VAR'                                                          
HelloAskUbuntu
$ 

Додаткове читання


3
Ні, ~в ~/.composer/vendor/binне розширюватиметься! Тильда розширюється лише в декількох спеціальних місцях, як безпосередньо після =знаку. PATH="~/.foo:$PATH"результати в ~/.foo:/other/path/dirs.... Але ~буде розширено в Росії PATH=~"/.foo:$PATH", що призводить до /home/user/.foo:/other/path/dirs....
Volker Siegel

2

Я читав тут і в інших місцях в Інтернеті, говорив з другом про це і вирішив, що як першокурсник (можливо, більше першокурсник Ubuntu, то дехто тут може подумати), я повинен скласти цю команду - я повинен зробити карту і таким чином, дізнайтеся, що це з ким і звідки:

Попередні дані

Якщо ви зараз чогось не зрозуміли в цій главі - не хвилюйтеся, це стане зрозумілішим, оскільки ви будете читати, але для розуміння цього питання вам потрібно прочитати змінні середовища (EVs), їх значення та призначення . Зараз я спробую пояснити команду простими словами та методом відображення для новачків, як я, і лише для новачків. Спробував тут зробити все можливе ...

Картографування

export PATH="~/.composer/vendor/bin:$PATH"

Початкове значення EV "PATH", що поставляється з Ubuntu 15.10, становить:

/usr/bin:/usr/sbin

У самій команді на замітку у нас є дві фрази PATH. Останнє - $ PATH - $ говорить "надрукувати початкове значення або значення EV поруч із вами"; EV поруч із нею - PATH EV.

Ми експортували саму змінну шляху (зробили її доступною і для підпроцесів, і IE-процесів, що працюють у CLI, які насправді не є оболонкою Bash, але запускаються всередині неї (наприклад, Drush , який є Drupal CLI).

Крім експорту ми також розширили його: Перша фраза PATH (PATH =) використовувала нас для додавання додаткового значення (~ / .composer / vendor / bin :) до вихідного значення (представленого $ PATH).

  • Двокрапка (:) в кінці нового значення, про яке я згадував у вищевказаному абзаці, використовує для відмежування нового значення від початкового.

  • "" - область, у якій знаходяться значення / s.

  • ~ - домашня папка.


Я сподіваюся, що після цього картографування, який я зробив, команда стане зрозумілішою для першокурсників, як я.


1

exportКоманда робить змінними доступна в подоболочкі. Тобто, без цього змінна PATHне була б видна в підшалах.

PATH згадується двічі:

  • Як змінна значення присвоюється ліворуч від =знака.
  • Як ім'я змінної замінюється її значенням права =знака. Це робить старе значення частиною нового значення.

1
"Тобто, без цього змінна PATHне була б видима в підрозділах." Це неправильно; PATH- це змінна середовище (яка не зовсім те саме, що змінна оболонки ), тому вона автоматично експортується, а exportкоманда є непотрібною.
Девід

Сімейство оболонок Bourne насправді не розрізняє змінні оболонки та середовища. ( sc.tamu.edu/help/general/unix/vars.html ) У моїй системі (Arch Linux) bash навіть не знає setenvкоманди.
rexkogitans

1
Існує ще різниця між змінними середовища, про які ядро ​​знає, і змінними оболонки, які є внутрішніми для bash. Оскільки PATHпоходить з оточення, він автоматично експортується, тому вам не потрібно запускати exportзміни, які слід поширювати на дочірні процеси (всупереч тому, що говорить сторінка, яку ви пов’язали).
Девід

Змінні середовища не є властивістю ядра, а процесу. Оскільки процес, про який ми говоримо тут, sh, bash (чи Ubuntu використовує zsh?), Я думаю, ми можемо залишити їх рівними змінним оболонок. Але, звичайно, змінні оболонки не передаються жодним випадковим програмам, як змінні середовища.
rexkogitans

Я думаю, що ми в цей момент занурилися в семантику. Все, що я намагався сказати, це те, що в баш, PATH=fooі export PATH=fooмають однакову поведінку.
Девід

0
export PATH="~/.composer/vendor/bin:$PATH"
  1. exportє командою Buildin Баш, значить експортувати змінні бути envirement змінної. (Ви можете набрати help exportбільше, щоб нахилитися

    (charactors слідують команді - це параметри, розділені пробілом, тому в цьому випадку існує лише один параметр)

  2. the PATH- назва змінної, як правило, заздалегідь визначена варіабелем bash, має бути названа у верхньому регістрі.

  3. =означає привласнити значення цієї змінної.

  4. вся рядок - це значення варіабеля

  5. the $PATH- це своєрідний функціонал bash, іменований variable expantion, bash замінить значення існування PATHв рядку параметра, ПЕРЕД надіслати рядок exportкоманді

  6. :в spcial напівкоксу в змінної PATH і understooded усіма додатка , які хочуть використовувати цю змінну. це означає сеператор. тож у них буде багато каталогів в змінній PATH.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.