Мне интересно, где новый путь должен быть добавлен к PATH
переменной среды. Я знаю, что это может быть достигнуто путем редактирования .bashrc
(например), но не ясно, как это сделать.
Сюда:
export PATH=~/opt/bin:$PATH
или это?
export PATH=$PATH:~/opt/bin
PATH=$PATH:$HOME/.local/bin:$HOME/bin
, можно добавить другой путь, разделив его: напримерPATH=$PATH:$HOME/.local/bin:$HOME/bin:/home/ec2-user/pear/bin
.Ответы:
Простые вещи
или же
в зависимости от того, хотите ли вы добавить
~/opt/bin
в конце (для поиска после всех других каталогов, если есть программа с одинаковым именем в нескольких каталогах) или в начале (для поиска перед всеми другими каталогами).Вы можете добавить несколько записей одновременно.
PATH=$PATH:~/opt/bin:~/opt/node/bin
или вариации на заказ работают просто отлично. Не ставьтеexport
в начале строки, так как это связано с дополнительными сложностями (см. Ниже «Примечания к оболочкам, кроме bash»).Если ваша система
PATH
создается из множества различных компонентов, вы можете получить дублирующиеся записи. См. Как добавить путь к домашней директории, который будет обнаружен Unix, какой командой? и удалите дубликаты записей $ PATH с помощью команды awk, чтобы избежать добавления дубликатов или их удаления.~/bin
Кстати, некоторые дистрибутивы автоматически помещают в ваш PATH, если он существует.Где его поставить
Поместите линию , чтобы изменить
PATH
в~/.profile
, или ,~/.bash_profile
если это то, что у вас есть.Обратите внимание, что
~/.bash_rc
не читается ни одной программой, и~/.bashrc
является файлом конфигурации интерактивных экземпляров bash. Вы не должны определять переменные среды в~/.bashrc
. Правильное место для определения переменных среды, таких какPATH
is~/.profile
(или~/.bash_profile
если вас не волнуют другие оболочки, кроме bash). Посмотрите, в чем разница между ними и какой я должен использовать?Не помещайте это в
/etc/environment
или~/.pam_environment
: это не файлы оболочки, вы не можете использовать подстановки, как$PATH
там. В этих файлах вы можете только переопределить переменную, но не добавлять к ней.Потенциальные осложнения в некоторых системных скриптах
Вам не нужно,
export
если переменная уже находится в среде: любое изменение значения переменной отражается в среде.PATH
¹ в значительной степени всегда в среде; все системы Unix устанавливают его очень рано (обычно в самом первом процессе).Во время входа в систему вы можете полагаться на то,
PATH
что уже находитесь в среде и уже содержат некоторые системные каталоги. Если вы пишете сценарий , который может быть выполнен в начале при установке какой - то виртуальной среде, необходимо убедиться , чтоPATH
не является пустым и экспортируется: еслиPATH
до сих пор не установлено, то что - то вродеPATH=$PATH:/some/directory
бы установленPATH
на:/some/directory
, а пустой компонент в начале означает текущий каталог (как.:/some/directory
).Примечания о снарядах, кроме Баш
В bash, ksh и zsh,
export
есть специальный синтаксис, и то и другоеPATH=~/opt/bin:$PATH
иexport PATH=~/opt/bin:$PATH
делают правильные вещи даже. В других оболочках в стиле Bourne / POSIX, таких как dash (который есть/bin/sh
во многих системах),export
анализируется как обычная команда, что подразумевает два различия:~
анализируется только в начале слова, кроме как в присваиваниях (подробнее см. Как добавить путь к домашнему каталогу, который должен обнаружить Unix, какая команда? );$PATH
вне двойных кавычек разрывается, еслиPATH
есть пробел или\[*?
.Таким образом, в таких оболочках, как dash,
устанавливаетсяexport PATH=~/opt/bin:$PATH
PATH
литеральная строка,~/opt/bin/:
за которой следует значениеPATH
до первого пробела.PATH=~/opt/bin:$PATH
(голое задание) не требует кавычек и делает правильные вещи. Если вы хотите использоватьexport
в переносимом скрипте, вам нужно написатьexport PATH="$HOME/opt/bin:$PATH"
илиPATH=~/opt/bin:$PATH; export PATH
(илиPATH=$HOME/opt/bin:$PATH; export PATH
для переносимости даже в оболочку Bourne, которая не принималаexport var=value
и не выполняла расширение тильды).¹ Это было не так в оболочках Bourne (как в реальной оболочке Bourne, а не в современных оболочках в стиле POSIX), но в наши дни вы вряд ли встретите такие старые оболочки.
источник
export
..bashrc
. Я предполагаю, что, поскольку FZF написан на Rust, он также следует шаблону Rust.В любом случае работает, но они не делают то же самое: элементы
PATH
проверяются слева направо. В вашем первом примере исполняемые файлы in~/opt/bin
будут иметь приоритет над установленными, например in/usr/bin
, которые могут быть, а могут и не быть теми , которые вы хотите.В частности, с точки зрения безопасности, опасно добавлять пути вперед, потому что, если кто-то может получить доступ для записи к вашему
~/opt/bin
, он может добавить, например, другоеls
, которое вы, вероятно, вместо этого могли бы использовать вместо этого. из того/bin/ls
не замечая. Теперь представьте то же самое дляssh
или вашего браузера или выбора ... (То же самое происходит трижды для вставки на вашем пути.)источник
ls
, вы должны поместить ее в каталог заранее/bin
.Я смущен вопросом 2 (так как удален из вопроса, так как это было связано с не связанной проблемой):
Если вы говорите
это все, что будет в вашем ПУТИ. PATH - это просто переменная окружения, и если вы хотите добавить ее в PATH, вам нужно перестроить переменную с тем содержимым, которое вы хотите. То есть то, что вы приводите в качестве примера к вопросу 2, это именно то, что вы хотите сделать, если только я полностью не упускаю суть вопроса.
Я использую обе формы в моем коде. У меня есть общий профиль, который я устанавливаю на каждой машине, на которой я работаю, который выглядит так, чтобы приспособиться к потенциально отсутствующим каталогам:
источник
Пуленепробиваемый способ добавления / предоплаты
Есть много соображений, связанных с выбором добавления против предварительного добавления. Многие из них описаны в других ответах, поэтому я не буду повторять их здесь.
Важным моментом является то, что, даже если системные скрипты не используют это (интересно, почему) * 1 , пуленепробиваемый способ добавить путь (например,
$HOME/bin
) в переменную среды PATH - этодля добавления (вместо
PATH="$PATH:$HOME/bin"
) иза предлог (вместо
PATH="$HOME/bin:$PATH"
)Это позволяет избежать ложного
$PATH
начального / конечного двоеточия, когда оно изначально пустое, что может иметь нежелательные побочные эффекты и может стать кошмаром , который трудно найти ( этот ответ кратко касается случая «в пути»awk
).Пояснение (из расширения параметров оболочки ):
Таким образом,
${PATH:+${PATH}:}
расширяется до: 1) ничего, еслиPATH
ноль или не установлен, 2)${PATH}:
, еслиPATH
установлено.Примечание : это для bash.
* 1 Я только что обнаружил, что подобные сценарии
devtoolset-6/enable
действительно используют это,источник
Linux определяет путь поиска исполняемого файла с помощью
$PATH
переменной среды. Чтобы добавить каталог / data / myscripts в начало$PATH
переменной среды, используйте следующее:Чтобы добавить этот каталог в конец пути, используйте следующую команду:
Но предыдущего недостаточно, потому что когда вы устанавливаете переменную среды внутри скрипта, это изменение вступает в силу только внутри скрипта. Есть только два способа обойти это ограничение:
Примеры:
Включение в основном включает «вызываемый» сценарий в «вызывающий» сценарий. Это как #include в C. Так что это эффективно внутри "вызывающего" скрипта или программы. Но, конечно, это не эффективно ни в каких программах или скриптах, вызываемых вызывающей программой. Чтобы сделать его эффективным на протяжении всей цепочки вызовов, вы должны следовать настройке переменной среды с помощью команды экспорта.
Например, программа оболочки bash включает содержимое файла .bash_profile путем включения. Поместите следующие 2 строки в .bash_profile:
эффективно помещает эти 2 строки кода в программу bash. Таким образом, в bash переменная $ PATH включает
$HOME/myscript.sh
и из-за оператора экспорта все программы, вызываемые bash, имеют измененную$PATH
переменную. И поскольку любые программы, которые вы запускаете из приглашения bash, вызываются bash, новый путь действует для всего, что вы запускаете из приглашения bash.Суть в том, что для добавления нового каталога к пути вы должны добавить или добавить каталог к переменной среды $ PATH в сценарии, включенном в оболочку, и вы должны экспортировать
$PATH
переменную среды.Больше информации здесь
источник
Уже некоторое время я держал со мной две функции
pathadd
иpathrm
которые помогают в добавлении элементов в пути без необходимости беспокоиться о дупликации.pathadd
принимает один аргумент пути и необязательныйafter
аргумент, который, если он указан, добавится к нему, вPATH
противном случае он будет добавленПочти в любой ситуации, если вы добавляете к пути, вы, вероятно, захотите переопределить все, что уже есть в пути, поэтому я предпочитаю добавлять по умолчанию.
Поместите их в любой скрипт, который вы хотите изменить в среде PATH, и теперь вы можете это сделать.
Вы гарантированно не добавите к пути, если он уже есть. Если вы хотите, чтобы убедиться
/baz/bat
, в начале.Теперь любой путь может быть перемещен вперед, если он уже находится на пути без удвоения.
источник
Я не могу говорить о других дистрибутивах, но в Ubuntu есть файл / etc / environment, который является путем поиска по умолчанию для всех пользователей. Поскольку мой компьютер используется только мной, я помещаю туда любые каталоги, которые мне нужны, если только это не временное дополнение, которое я добавляю в скрипт.
источник
В некоторых ситуациях его использование
PATH=/a/b:$PATH
может считаться «неправильным» способом добавления пути кPATH
:PATH
в той же форме.PATH
другой форме (например, псевдоним из-за использования символических ссылок или..
).PATH
когда он предназначен для переопределения других записей вPATH
.Эта (только для Bash) функция делает «правильные вещи» в вышеуказанных ситуациях (за исключением, см. Ниже), возвращает коды ошибок и печатает приятные сообщения для людей. Коды ошибок и сообщения могут быть отключены, когда они не нужны.
Исключением является то, что эта функция не канонизирует пути, добавленные с
PATH
помощью других средств, поэтому, если неканонический псевдоним для пути включенPATH
, это добавит дубликат. Попытка канонизировать уже существующие путиPATH
является рискованным предложением, поскольку относительный путь имеет очевидное значение при передаче,prepath
но когда он уже находится в пути, вы не знаете, каким был текущий рабочий каталог, когда он был добавлен.источник
$PATH
что и раньше. Что касается-r
, нет, я думаю, что относительные пути$PATH
слишком ненадежны и странны (ваш путь меняется каждый раз, когда выcd
!), Чтобы хотеть поддерживать что-то подобное в общем инструменте.Для меня (в Mac OS X 10.9.5) добавление пути (например
/mypathname
) к файлу/etc/paths
работало очень хорошо.Перед редактированием
echo $PATH
возвращает:После редактирования
/etc/paths
и перезапуска оболочки к переменной $ PATH добавляется/pathname
. Действительно,echo $PATH
возвращает:То, что произошло,
/mypathname
было добавлено к$PATH
переменной.источник
Чтобы добавить новый путь к
PATH
переменной среды:Для этого изменения должны быть применены к любой оболочке вы открываете, добавьте его в файл , что оболочка источника , когда она вызывается. В разных оболочках это может быть:
например
Вы можете увидеть указанный путь в приведенном выше выводе.
источник
Вот мое решение:
Хороший легкий лайнер, который не оставляет след
:
источник