Что означает экспорт PATH = что-то: $ PATH?

27

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

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

Я немного знаю проблемы переменных среды и их значений из Windows, но в этом случае я хочу понять, что делает эта команда, и из каких частей она состоит:

  1. Что это за фраза "экспорт" в начале? Это экспорт данных, которые будут доступны для Bash?

  2. Что такое первое, PATHа что второе $PATH, и зачем нам два?

JohnDoea
источник
Если не считать некоторых технических различий между операционными системами, это эквивалентно этому процессу в Windows: windowsitpro.com/systems-management/…
Двухразрядный алхимик,
1
«export» делает изменения видимыми для новых программ, запускаемых bash.
Турбьёрн Равн Андерсен
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:в начале).

кос
источник
Потрясающее объяснение.
Чойлтон Б. Хиггинботтом
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....
Фолькер Сигел
2

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

Предварительные данные

Если на данный момент вы не поняли что-то в этой главе - не волнуйтесь, это станет более понятным, так как вы будете продолжать читать, но чтобы понять этот вопрос, вам нужно прочитать переменные среды (EV), их значения и цель. , Теперь я попытаюсь объяснить команду простыми словами и методом отображения для новичков, таких как я, и только для новичков. Пытался сделать все возможное здесь ...

картографирование

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

Исходное значение EV «PATH» в Ubuntu 15.10:

/usr/bin:/usr/sbin

В самой заметке команды у нас есть две фразы PATH. Последний - $ PATH - $ говорит «напечатать оригинальное значение или значения EV рядом с вами»; EV рядом с ним - ПУТЬ EV.

Мы экспортировали саму переменную пути (сделав ее доступной также для подпроцессов, процессов IE, которые выполняются в CLI, которые на самом деле не являются оболочкой Bash, но работают внутри нее (например, Drush , которая является Drupal CLI).

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

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

  • «» - это область, в которой находятся значения.

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


Я надеюсь, что после того, как я сделал это отображение, команда будет понятнее новичкам, таким как я.

JohnDoea
источник
1

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

PATH упоминается дважды:

  • В качестве переменной присваивается значение слева от =знака.
  • В качестве имени переменной подставляется ее значение справа от =знака. Это делает старое значение частью нового значения.
rexkogitans
источник
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
Я думаю, что в этот момент мы увязли в семантике. Все, что я пытался сказать, это то, что в bash, PATH=fooи export PATH=fooведут себя идентично
Дэвид
0
export PATH="~/.composer/vendor/bin:$PATH"
  1. exportявляется командой Buildin Баш, значит экспортировать переменные быть envirement переменной. (вы могли бы напечатать help exportбольше

    (символы, следующие за командой, являются параметрами, разделенными пробелами, поэтому в этом случае существует только один параметр)

  2. PATHэто имя переменной, как правило, предопределен varibale на баш, будет назван в прописные.

  3. =означает присвоить значение этой переменной.

  4. вся строка является значением переменной

  5. $PATHявляется своим родом Funciton Баша, названное variable expantion, Баш заменит значение EXIST PATHв строке параметров, перед отправкой в строке exportкоманды

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

lovespring
источник