Intereting Posts
Скрытый раздел ext4? Почему текстовые редакторы устанавливают mtime при сохранении, если никаких изменений не было сделано? Получение большого количества ошибок из / dev / sda Почему не удалось установить XFS после спасения, почему? Восстановить / etc / файлы конфигурации по умолчанию разрешить зарегистрированному пользователю включить чашечный принтер с помощью cupsenabler Автоматически прикреплять файл к почте с помощью mutt «Обновление программного обеспечения» в Debian пуст, но доступны обновления как использовать awk / cut для получения данных столбца, имеющего пространство как заменить значение вычислением в bash / sed Отключение отображения функциональной клавиши gnome Параллельные скрипты Python на удаленной машине Использование двухточечного VPN не похоже на правильный сетевой интерфейс Может ли Awk читать экранированные строки? Т.е. читать прошлые строки Почему этот случайный пароль помечен, говоря, что он слишком упрощен / систематичен?

Как правильно добавить путь к PATH?

Мне интересно, где новый путь должен быть добавлен в PATH среды PATH . Я знаю, что это может быть выполнено путем редактирования .bashrc (например), но неясно, как это сделать.

Сюда:

 export PATH=~/opt/bin:$PATH 

или это?

 export PATH=$PATH:~/opt/bin 

Простые вещи

 PATH=$PATH:~/opt/bin PATH=~/opt/bin:$PATH 

в зависимости от того, хотите ли вы добавить ~/opt/bin в конце (для поиска по всем другим каталогам, если есть программа с тем же именем в нескольких каталогах) или в начале (для поиска перед всеми другими каталогами ).

Вы можете добавить несколько записей одновременно. PATH=$PATH:~/opt/bin:~/opt/node/bin или изменения в порядке упорядочения просто отлично.

Вам не нужно export если переменная уже находится в среде: любое изменение значения переменной отражается в среде PATH почти всегда находится в среде; все системы unix устанавливают его очень рано (обычно в самом первом процессе, по сути).

Если ваш PATH будет построен в разных компонентах, вы можете получить дубликаты записей. См. Как добавить путь к исходному каталогу, который будет обнаружен Unix, какая команда? и удалите повторяющиеся записи $ PATH с помощью команды awk, чтобы избежать добавления дубликатов или их удаления.

Где поставить

Обратите внимание, что ~/.bash_rc не читается какой-либо программой, а ~/.bashrc – это файл конфигурации интерактивных экземпляров bash. Вы не должны определять переменные среды в ~/.bashrc . Правильное место для определения переменных среды, таких как PATH равно ~/.profile (или ~/.bash_profile если вам не нужны оболочки, отличные от bash). Посмотрите, в чем разница между ними и какой из них я должен использовать?

Заметки о оболочках, отличных от bash

В bash, ksh и zsh, export является специальным синтаксисом, и оба PATH=~/opt/bin:$PATH и export PATH=~/opt/bin:$PATH делают все правильно. В других оболочках Bourne / POSIX, таких как тире (которые есть /bin/sh во многих системах), export анализируется как обычная команда, что подразумевает две отличия:

  • ~ анализируется только в начале слова, за исключением назначений (см. раздел «Как добавить путь к исходному каталогу, который будет обнаружен Unix, какая команда?» ).
  • $PATH вне двойных кавычек ломается, если PATH содержит пробелы или \[*? ,

Таким образом, в оболочках, подобных тире, export PATH=~/opt/bin:$PATH устанавливает PATH в литеральную строку ~/opt/bin/: за ней следует значение PATH до первого места. PATH=~/opt/bin:$PATH (нечеткое задание) не требует кавычек и делает правильные вещи. Если вы хотите использовать export в переносном скрипте, вам нужно написать export PATH="$HOME/opt/bin:$PATH" .

¹ Это было неверно в ракетах Борна (как в реальной оболочке Борна, не в современных оболочках в стиле POSIX), но вы вряд ли столкнетесь с такими старыми оболочками в наши дни.

В любом случае это работает, но они не делают то же самое: элементы PATH проверяются слева направо. В первом примере исполняемые файлы в ~/opt/bin будут иметь приоритет над установленными, например, в /usr/bin , что может быть или не быть тем, что вы хотите.

В частности, с точки зрения безопасности, опасно добавлять пути к фронту, потому что, если кто-то может получить доступ на запись к вашему ~/opt/bin , они могут, например, разместить другие ls , которые вы 'd, то, вероятно, используйте вместо /bin/ls не заметив. Теперь представьте себе то же, что и для ssh или вашего браузера или выбора … (То же самое можно сделать трижды на вашем пути.)

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

Каков эффективный способ добавления дополнительных путей в разные строки? Первоначально я думал, что это может сделать трюк:

 export PATH=$PATH:~/opt/bin export PATH=$PATH:~/opt/node/bin 

но это происходит не потому, что второе назначение не только добавляет ~/opt/node/bin , но и все ранее назначенные PATH .

Это возможное решение:

 export PATH=$PATH:~/opt/bin:~/opt/node/bin 

но для удобства чтения я предпочел бы иметь одно назначение для одного пути.

Если вы говорите

 PATH=~/opt/bin 

это все, что будет в вашем PATH. PATH – это просто переменная среды, и если вы хотите добавить в PATH, вам нужно перестроить переменную именно с нужным содержимым. То есть то, что вы даете в качестве примера на вопрос 2, – это именно то, что вы хотите сделать, если я полностью не упущу точку вопроса.

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

 export PATH=/opt/bin:/usr/local/bin:/usr/contrib/bin:/bin:/usr/bin:/usr/sbin:/usr/bin/X11 # add optional items to the path for bindir in $HOME/local/bin $HOME/bin; do if [ -d $bindir ]; then PATH=$PATH:${bindir} fi done 

Linux определяет исполняемый путь поиска с $PATH среды $PATH . Чтобы добавить каталог / данные / myscripts в начало $PATH среды $PATH , используйте следующее:

 PATH=/data/myscripts:$PATH 

Чтобы добавить этот каталог в конец пути, используйте следующую команду:

 PATH=$PATH:/data/myscripts 

Но предыдущие недостаточно, потому что, когда вы устанавливаете переменную среды внутри скрипта, это изменение действует только внутри скрипта. Это ограничение ограничено только двумя способами:

  • Если в сценарии вы экспортируете переменную окружения, она эффективна в рамках любых программ, вызываемых скриптом. Обратите внимание, что это не эффективно в программе, которая называется скриптом.
  • Если программа, вызывающая сценарий, делает это путем включения вместо вызова, любые изменения среды в скрипте эффективны в вызывающей программе. Такое включение может быть выполнено с помощью команды dot или команды source.

Примеры:

 $HOME/myscript.sh source $HOME/myscript.sh 

Включение в основном включает «вызываемый» скрипт в сценарии «вызова». Это похоже на #include в C. Таким образом, он эффективен внутри скрипта или программы вызова. Но, конечно, это не эффективно для любых программ или скриптов, вызываемых вызывающей программой. Чтобы сделать его эффективным вплоть до цепочки вызовов, вы должны следовать настройке переменной среды с помощью команды export.

В качестве примера, программа оболочки bash включает в себя содержимое файла .bash_profile по включению. Итак, добавив следующие 2 строки в .bash_profile:

 PATH=$PATH:/data/myscripts export PATH 

эффективно помещает эти 2 строки кода в программу bash. Таким образом, в bash переменная $ PATH включает $HOME/myscript.sh , и из-за инструкции экспорта любые программы, вызываемые bash, имеют измененную $PATH . И поскольку любые программы, запускаемые из приглашения bash, вызывается bash, новый путь действует для всего, что вы запускаете из подсказки bash.

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

Дополнительная информация здесь

В течение некоторого времени я сохранил со мной две функции pathadd и pathrm которые помогают добавлять элементы в путь без необходимости беспокоиться о дублированиях.

pathadd принимает один аргумент пути и необязательный аргумент after который, если он будет добавлен, добавится к PATH иначе он добавит его.

Почти в каждой ситуации, если вы добавляете путь, вы, вероятно, хотите переопределить все, что уже есть в пути, поэтому я предпочитаю добавлять по умолчанию.

 pathadd() { newelement=${1%/} if [ -d "$1" ] && ! echo $PATH | grep -E -q "(^|:)$newelement($|:)" ; then if [ "$2" = "after" ] ; then PATH="$PATH:$newelement" else PATH="$newelement:$PATH" fi fi } pathrm() { PATH="$(echo $PATH | sed -e "s;\(^\|:\)${1%/}\(:\|\$\);\1\2;g" -e 's;^:\|:$;;g' -e 's;::;:;g')" } 

Поместите их в любой скрипт, который вы хотите изменить среду PATH, и теперь можете это сделать.

 pathadd "/foo/bar" pathadd "/baz/bat" after export PATH 

Вам гарантировано не добавлять к пути, если он уже существует. Если вы теперь хотите, чтобы /baz/bat был на старте.

 pathrm "/baz/bat" pathadd "/baz/bat" export PATH 

Теперь любой путь можно перенести на передний план, если он уже находится на пути без удвоения.

Я не могу говорить о других дистрибутивах, но у Ubuntu есть файл, / etc / environment, который является стандартным поисковым путем для всех пользователей. Поскольку мой компьютер используется только мной, я помещаю любые каталоги, которые я хочу на моем пути, если только это временное дополнение, которое я ввел в сценарий.

Вот мое решение:

 PATH=$(echo -n $PATH | awk -v RS=: -v ORS=: '!x[$0]++' | sed "s/\(.*\).\{1\}/\1/") 

Хороший легкий лайнер, который не оставляет трейлинг :

Для меня (в Mac OS X 10.9.5) добавление имени пути (например, /mypathname ) в файл /etc/paths очень хорошо работало.

Перед редактированием возвращается echo $PATH :

 /usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin 

После редактирования /etc/paths и перезапуска оболочки переменная $ PATH добавляется с /pathname . Действительно, echo $PATH возвращает:

 /usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/mypathname 

Случилось так, что /mypathname добавлено в $PATH .

Чтобы добавить новый путь к PATH среды PATH :

 export PATH=$PATH:/new-path/ 

Чтобы это изменение применялось к каждой открытой оболочке, добавьте ее в файл, который будет вызываться оболочкой при ее вызове. В разных оболочках это может быть:

  • Bash Shell: ~ / .bash_profile, ~ / .bashrc или профиль
  • Korn Shell: ~ / .kshrc или .profile
  • Z Shell: ~ / .zshrc или .zprofile

например

 # export PATH=$PATH:/root/learning/bin/ # source ~/.bashrc # echo $PATH 

Вы можете увидеть предоставленный путь в вышеупомянутом выходе.