Как навсегда установить $ PATH в Linux / Unix?

882

Я пытаюсь добавить каталог в мой путь, чтобы он всегда был в моем пути Linux. Я пробовал:

export PATH=$PATH:/path/to/dir

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

Как я могу сделать это, чтобы это было установлено навсегда?

Нажмите Upvote
источник

Ответы:

231

Есть несколько способов сделать это. Фактическое решение зависит от цели.

Значения переменных обычно хранятся либо в списке назначений, либо в сценарии оболочки, который запускается в начале сеанса системы или пользователя. В случае сценария оболочки вы должны использовать определенный синтаксис оболочки и / exportили setкоманды.

Система в целом

  1. /etc/environmentСписок уникальных заданий, позволяет ссылки. Идеально подходит для добавления общесистемных каталогов , как /usr/local/something/binк PATHпеременной или определения JAVA_HOME. Используется PAM и SystemD.
  2. /etc/environment.d/*.confСписок уникальных заданий, позволяет ссылки. Идеально подходит для добавления общесистемных каталогов , как /usr/local/something/binк PATHпеременной или определения JAVA_HOME. Конфигурация может быть разбита на несколько файлов, обычно по одному на каждый инструмент (Java, Go, NodeJS). Используется SystemD, которые по своей конструкции не передают эти значения в оболочки входа пользователя.
  3. /etc/xprofileСценарий оболочки выполняется при запуске сеанса X Window System. Это выполняется для каждого пользователя, который входит в систему X Window. Это хороший выбор для PATHзаписей, которые действительны для каждого пользователя, как /usr/local/something/bin. Файл включен другим скриптом, поэтому используйте синтаксис оболочки POSIX, а не синтаксис вашей пользовательской оболочки.
  4. /etc/profileи /etc/profile.d/*сценарий оболочки. Это хороший выбор для систем только с оболочкой. Эти файлы читаются только оболочками в режиме входа в систему.
  5. /etc/<shell>.<shell>rc, Сценарий оболочки. Это плохой выбор, потому что он специфичен для отдельной оболочки. Используется в режиме без входа в систему.

Сессия пользователя

  1. ~/.pam_environment, Список уникальных заданий, ссылки не допускаются. Загружается PAM в начале каждого пользовательского сеанса, не имеет значения, если это сеанс или оболочка X Window System. Вы не можете ссылаться на другие переменные, включая HOMEили PATHограниченное использование. Используется PAM.
  2. ~/.xprofileСценарий оболочки. Это выполняется, когда пользователь входит в систему X Window System. Определенные здесь переменные видны каждому приложению X. Идеальный выбор для дополнения PATHтакими значениями, как ~/binили ~/go/binили определяя специфичные для пользователя GOPATHили NPM_HOME. Файл включен другим скриптом, поэтому используйте синтаксис оболочки POSIX, а не синтаксис вашей пользовательской оболочки. Ваш графический текстовый редактор или IDE, запущенная с помощью ярлыка, увидит эти значения.
  3. ~/.profile, ~/.<shell>_profile, ~/.<shell>_loginShell скрипт. Он будет виден только для программ, запущенных из терминала или эмулятора терминала. Это хороший выбор для систем только с оболочкой. Используется оболочками в режиме входа в систему.
  4. ~/.<shell>rc, Сценарий оболочки. Это плохой выбор, потому что он специфичен для отдельной оболочки. Используется оболочками в режиме без входа в систему.

Ноты

Gnome на Wayland запускает оболочку входа пользователя, чтобы получить среду. Он эффективно использует регистрационные конфигурации оболочки ~/.profile, ~/.<shell>_profile, ~/.<shell>_loginфайлы.

Руководства

  • окружающая обстановка
  • environment.d
  • удар
  • тире

Распространение специальной документации

связанные с

Разница между Оболочкой входа в систему и Оболочкой без регистрации?

Grzegorz Żur
источник
4
Спасибо за подробный ответ, это должно быть выше. Может быть, .bash_profileстоит добавить и в список?
Джеймс Ко
2
@JamesKo, который был номером 4
trve.fa7ad
1
Я думаю, что лучший ответ предлагается /etc/environment. Но могу ли я обновить его без выхода и входа? Иногда я не использую bash или sh, поэтому source /etc/environmentне работает.
banan3'14
2
Отличный и на мой взгляд самый полный ответ. Должно быть намного выше.
Питер Глор
2
Моя причина для поиска этой темы была на самом деле Go. Рад видеть, что я не единственный, кто понял, что .bashrc не то место. ;)
Питер Глор
1039

Вам нужно добавить его в свой ~/.profileили ~/.bashrcфайл. 

export PATH="$PATH:/path/to/dir"

В зависимости от того, что вы делаете, вы также можете использовать символическую ссылку на двоичные файлы:

cd /usr/bin
sudo ln -s /path/to/binary binary-name

Обратите внимание, что это не будет автоматически обновлять ваш путь до конца сеанса. Для этого вам нужно запустить:

source ~/.profile 
or
source ~/.bashrc
mpowered
источник
11
Пара вопросов. 1) Не должно быть двоеточия между $PATHи /usr/bin. 2) Должен /usr/binдаже быть там. 3) Не лучше ли использовать /usr/local/bin?
Batandwa
197
Пожалуйста, обратите внимание : часто считается дырой в безопасности, чтобы оставлять в конце пути bash конечную двоеточие, потому что это делает так, чтобы bash просматривал текущий каталог, если не может найти исполняемый файл, который ищет. Пользователи, которые находят этот пост в поисках дополнительной информации, должны быть проинформированы об этом.
Erewok
51
@AdamRobertson Это небезопасно - рассмотрите сценарий, когда вы распаковываете tar-архив, затем cdв каталог, в который вы его распаковали, затем запускаете ls- и затем понимаете, что в tar-архиве была названа вредоносная программа ls.
Лили Чунг
21
Для меня это был .bash_profile, а не .profile. Кажется, это отличается для всех.
Donquixote
9
Я думаю, что я значительно улучшил качество этого ответа и решил несколько вопросов, которые подняли другие пользователи. Каждый экспорт пути или каждая команда, которая корректирует путь, всегда должны разделять существующий путь двоеточием. Никогда не следует использовать начальные или конечные двоеточия, а текущий каталог никогда не должен находиться в пути.
Эрик Робертсон
243

В Ubuntu отредактируйте /etc/environment. Его единственная цель - хранить переменные среды. Первоначально переменная $ PATH определяется здесь. Это вставка из моего /etc/environmentфайла:

PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games"

Таким образом, вы можете просто открыть этот файл как root и добавить все, что захотите.

Для немедленных результатов, запустите (попробуйте как обычный пользователь и root):

source /etc/environment && export PATH

ОБНОВИТЬ:

Если вы используете zsh(он же Z Shell), добавьте эту строку сразу после комментариев в /etc/zsh/zshenv:

source /etc/environment

Я столкнулся с этой маленькой причудой на Ubuntu 15.10, но если ваш zsh не получает правильный PATH , возможно, поэтому

trve.fa7ad
источник
13
Не все системы имеют / etc / environment
user3439968
9
FWIW $PATHтакже определен /etc/profileв Arch Linux.
Sparhawk
3
@ e-sushi Я шокирован этим. Я сам на Ubuntu 14.04.1. и я могу обещать вам, что файл был встроен.
trve.fa7ad
2
Попробовав каждое предложение под солнцем, кроме / etc / environment, и убедившись, что все они НЕ работают, я наконец наткнулся на это. Я также на Ubuntu 14.04, и это единственный, который фактически изменил переменную PATH после перезагрузки.
Chockomonkey
4
Пользователь должен перезагрузить компьютер после обновления файла среды.
Harish_N
71

Поместите exportдекларацию в ~/.bashrc. Мой .bashrc содержит это:

export PATH=/var/lib/gems/1.8/bin:/home/fraxtil/.bin:$PATH
Fraxtil
источник
7
перезагрузка нужна?
Нажмите Upvote
2
Работал, когда я положил это в .profile', не нашел.bashrc
Нажмите Upvote
Это может зависеть от точной системы; Я не уверен, какие именно условия определяют, какой файл выполняется. Рад, что проблема была решена.
Fraxtil
12
@ Нажмите Upvote Вам нужно сделать, source ~/.bashrcчтобы перезагрузить .bashrcконфигурацию. Тогда это будет работать
BigSack
4
exportКлючевое слово необходимо , только если PATHеще не помечен как переменное окружение - что она почти безоговорочно будет. Просто PATH=/var/lib/gems/1.8/bin:/home/fraxtil/.bin:$PATHбудет иметь тот же эффект.
Чарльз Даффи
30

Вы можете установить $PATHнавсегда 2 способами.

  1. Чтобы установить путь для конкретного пользователя: Вам может потребоваться сделать запись .bash_profileв домашнем каталоге пользователя.

    например, в моем случае я буду устанавливать путь Java в профиле пользователя Tomcat

    [tomcat]$ echo "export PATH=$PATH:/path/to/dir" >> /home/tomcat/.bash_profile
  2. Чтобы установить общий путь для ВСЕХ пользователей системы, вам может потребоваться установить путь следующим образом:

    [root~]# echo "export PATH=$PATH:/path/to/dir" >> /etc/profile
Мохит М
источник
3
Назван ли файл /etc/profilesв sвашем дистрибутиве? У меня нет s. Я думаю, что у вас есть опечатка.
Крис Джонсон
3
Вы, вероятно, хотите экранировать $, который вы пишете в файл профиля. например, echo "export PATH = \ $ PATH: / path / to / dir" >> / etc / profile, таким образом вы фактически добавляете переменную при запуске этого скрипта, а не устанавливаете ее в буквальное значение на основе его значения в время выполнения этой начальной команды.
BuvinJ
15

Вы можете использовать на Centos или RHEL для локального пользователя:

echo $"export PATH=\$PATH:$(pwd)" >> ~/.bash_profile

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

Если вы не хотите делать повторный вход в систему, то можете использовать:

source ~/.bash_profile

Это перезагрузить # User specific environment and startup programsэтот комментарий присутствует в.bash_profile

Даниэль Антонио Нуньес Кархуайо
источник
12

Вы также можете установить навсегда, отредактировав один из этих файлов:

/etc/profile (для всех пользователей)

~/.bash_profile (для текущего пользователя)

~/.bash_login (для текущего пользователя)

~/.profile (для текущего пользователя)

Вы также можете использовать /etc/environmentдля установки постоянной переменной среды PATH, но она не поддерживает расширение переменной .

Извлечено из: http://www.sysadmit.com/2016/06/linux-anadir-ruta-al-path.html

Delucaramos
источник
7

Вчера я наткнулся на этот вопрос, когда искал способ добавить папку, содержащую мои собственные сценарии, в PATH - и был удивлен, обнаружив, что мой собственный ~/.profileфайл (в Linux Mint 18.1) уже содержал это:

# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/bin" ] ; then
    PATH="$HOME/bin:$PATH"
fi

Таким образом, все, что мне нужно было сделать, это создать папку ~/binи поместить туда свои скрипты.

RobertG
источник
7

Я думаю, что самый элегантный способ это:

1.Добавьте это в файл ~ / .bashrc.

Gedit ~ / .bashrc

добавьте свой путь внутри него

экспорт PATH = $ PATH: / opt / node / bin

2. источник ~ / .bashrc

(Ubuntu)

Химаншу Шарма
источник
6

Вы можете добавить эту строку в файл конфигурации консоли (например, .bashrc) или в .profile.

вода
источник
2
У меня нет ни одного из этих файлов/home/(username)
нажмите Upvote
3
@ClickUpvote: Какую оболочку вы используете? (И файлы, начинающиеся с точки, скрыты, вам нужно что-то вроде того, ls -aчтобы их видеть.)
Дэвид Шварц
Если у вас нет ни одного из этих файлов (bashrc или профиля), вы можете создать их вручную, и они будут автоматически использованы
trve.fa7ad
4

Постоянно добавлять переменную PATH

Глобальный:

echo "export PATH=$PATH:/new/path/variable" >> /etc/profile

Локальный (только для пользователя):

echo "export PATH=$PATH:/new/path/variable" >> ~/.profile

Для глобального перезапуска. Для местного релогина.

пример

Перед:

$ cat /etc/profile 

#!/bin/sh

export PATH=/usr/bin:/usr/sbin:/bin:/sbin

После:

$ cat /etc/profile 

#!/bin/sh

export PATH=/usr/bin:/usr/sbin:/bin:/sbin
export PATH=/usr/bin:/usr/sbin:/bin:/sbin:/new/path/variable

В качестве альтернативы вы можете просто отредактировать профиль:

$ cat /etc/profile 

#!/bin/sh

export PATH=/usr/bin:/usr/sbin:/bin:/sbin:/new/path/variable

Еще один способ (спасибо gniourf_gniourf):

echo 'PATH=$PATH:/new/path/variable' >> /etc/profile

Вы не должны использовать двойные кавычки здесь! echo 'export PATH = $ PATH: / new / path / variable' ... И, кстати, ключевое слово export, скорее всего, бесполезно, поскольку переменная PATH, скорее всего, уже помечена как экспортированная. - gniourf_gniourf

user3439968
источник
1
Нет. Вы не должны использовать двойные кавычки здесь! echo 'export PATH=$PATH:/new/path/variable'... И, кстати, exportключевое слово, скорее всего, бесполезно, поскольку PATHпеременная, скорее всего, уже помечена как экспортированная.
gniourf_gniourf
Нет, вы должны использовать двойные кавычки, потому что $ PATH в одинарных кавычках не интерполируется. И кстати экспорт тоже полезен.
user3439968 14.11.14
Я понял. Вы можете использовать двойные кавычки или одинарные кавычки, потому что $ PATH интерполируется при выполнении эха или интерполируется при выполнении / etc / profile.
user3439968
1
@ user3439968 на самом деле, двойные кавычки вызовут много проблем, если вы добавите $ PATH из нескольких файлов. Обратите внимание: когда вы используете двойные кавычки, $ PATH преобразуется в статическую строку со всеми ранее определенными каталогами PATH. скажем, вы добавляете /usr/localк нему, используя ~/.bashrc. теперь, если вы собираетесь добавить /opt/binк той же переменной, используя /etc/bash.bashrc; $ PATH будет преобразован в ту же статическую строку, в результате $ PATH будет заменен вместо добавления к ... Это будет зависеть от предпочтения системы одному файлу по сравнению с другим
trve.fa7ad
4

1. измените файл "/ etc / profile".

#vi /etc/profile

Нажмите клавишу «i», чтобы войти в статус редактирования и переместить курсор в конец файла, Дополнительные записи:

export PATH=$PATH:/path/to/dir;

Нажмите клавишу «Esc», чтобы выйти из режима редактирования, «: wq» сохранить файл.

2. сделать конфигурацию эффективной

source /etc/profile

Объясните: файл профиля работает для всех пользователей, если вы хотите быть действительным только для активного пользователя, установите файл ".bashrc"

Цзя
источник
4

После стольких исследований я нашел для этого простое решение (я использую элементарную ОС ), вдохновленное следующей ссылкой .

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

~$ sudo nano ~/.bashrc

Добавьте следующую строку в конец файла и сохраните.

export PATH="[FLUTTER_SDK_PATH]/flutter/bin:$PATH"

Например :

export PATH="/home/rageshl/dev/flutter/bin:$PATH"

введите описание изображения здесь

Я считаю, что это постоянное решение для установки пути в флаттере в дистрибутиве Ubuntu

Надеюсь, это будет полезно.

Рагеш С
источник
3

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

если вы находитесь в режиме входа в систему, то файлы, которые вы ищете, это / etc / bash или /etc/bash.bashrc

если вы не в режиме входа в систему, вы ищете файл /.profile или файлы в каталоге /.profiles.d

упомянутые выше файлы, если где системные переменные.

Dikinha
источник
3

Добавить в /etc/profile.dпапку скрипта [name_of_script].shс линией: export PATH=$PATH:/dir. Каждый скрипт в /etc/profile.dпапке автоматически выполняется при /etc/profileвходе в систему.

Юрий
источник
Это рекомендуемый способ настройки среды
Юрий
1
Это только если вы хотите, чтобы настройки были общесистемными, что, вероятно, не самый распространенный вариант использования. Большинство людей хотят (или должны хотеть), чтобы путь был задан локально, потому что большинство пользователей / ролей выполняют контекстно разные операции, и чем меньше предположений вы сделаете, тем лучше.
Усиленный
@mpowered, да, это только для всей системы. Если вы хотите локально изменить PATH, вы должны добавить такой же экспорт в ~ / .profile или ~ / .bashrc. Здесь вы должны учесть, что логины оболочки читают ~ / .profile, а интерактивные оболочки читают ~ / .bashrc. Это очень важно, потому что ssh, например, не делает логин, поэтому ~ / .profile не будет прочитан. Несколько дистрибутивов, например suse source ~ / .bashrc в / etc / profile. Но это не характерно для всех Linux '
Юрий
3

Zues77 имеет правильную идею. ОП не сказал «как я могу взломать мой путь через это». ОП хотел знать, как постоянно добавлять $ PATH:

sudo nano /etc/profile

Здесь он установлен для всего и является лучшим местом для изменения всего, что требует $ PATH

Джо Д
источник
3

Мой ответ связан с настройкой go-langon. Ubuntu linux/amd64Я столкнулся с той же проблемой установки пути переменных среды ( GOPATHи GOBIN), потери его при выходе из терминала и повторной сборки с использованием source <file_name>каждый раз. Ошибка состояла в том, чтобы указать путь ( GOPATHи GOBIN) в ~/.bash_profileпапке. Потратив несколько хороших часов, я обнаружил , что решение было поместить GOPATHи GOBINв ~/.bash_rcфайл в порядке:

export GOPATH=$HOME/go
export GOBIN=$GOPATH/bin
export PATH=$PATH:$GOPATH:$GOBIN

и при этом установка go работала нормально, и потерь на пути не было.

РЕДАКТИРОВАТЬ 1: Причина, по которой может быть связана эта проблема, заключается в том, что настройки для не входящих в систему оболочек, таких как ваш терминал ubuntu или gnome-терминал, где мы запускаем код go, берутся из ~./bash_rcфайла, а настройки для оболочек входа берутся из ~/.bash_profileфайла, и из ~/.profileфайла, если ~/.bash_profileфайл недоступен.

Абхирой Панвар
источник
3

Допустим, у вас установлена ​​MacOS, и у вас есть бинарный файл, которому вы доверяете и который хотите сделать доступным в вашей системе, но не обязательно хотите, чтобы каталог, в котором бинарный файл был добавлен в вашу PATH, вы можете выбрать для копирования / перемещения двоичный файл /usr/local/bin, который уже должен быть в вашей переменной PATH. Это сделает двоичный файл исполняемым, как и любой другой двоичный файл, к которому у вас уже есть доступ в вашем терминале.

Лео
источник
3

Его можно напрямую добавить с помощью следующей команды:

echo 'export PATH=$PATH:/new/directory' >> ~/.zshrc
source ~/.zshrc
Ануп Нагабхушан
источник
2
Вопрос помечен bash, так что это не очень полезно.
Лоренц Олб
2
Это верный ответ -> в заголовке упоминается только Linux, так что bash и ALSO zsh подойдут ... если тегирование только "bash", нам тоже нужно добавить "zsh" к тегам
Карлос Сальтос
2

лучший простой способ - следующая строка:
PATH="<directory you want to include>:$PATH"
в вашем файле .bashrc в домашнем каталоге.
Сброс не произойдет, даже если вы закроете терминал или перезагрузите компьютер. Его постоянный

Эдвард Торвальдс
источник
1
@quant, если вы делаете то, что сказано, он будет устанавливать ваши настройки навсегда. это будет работать, даже если вы закроете терминал.
Эдвард Торвальдс
1

Я думаю, что самый элегантный способ это:

1. добавить это в файл ~. / Bashrc

if [ -d "new-path" ]; then
  PATH=$PATH:new-path
fi

2. источник ~ / .bashrc

(Ubuntu)

Кимкуань Хуэй
источник
И чтобы отобразить путь после выше: printf "% s \ n" $ PATH
Robot70
1

Один способ добавить постоянный путь, который работал для меня, это:

    cd /etc/profile.d
    touch custom.sh
    vi custom.sh 
    export PATH=$PATH:/path according to your setting/

перезагрузите компьютер, и здесь мы идем путь будет там постоянно ура.

user6393373
источник
Вам на самом деле не нужно перезагружать компьютер. Выйти и вернуться снова достаточно. Это довольно элегантное решение, поскольку очень легко отменить любые изменения без необходимости редактировать файлы. Также легко указать оператор if, чтобы, если в системе не было каталога, он не добавлялся в переменную PATH.
Уорик,
0

Для распространения Debian вы должны:

    - edit ~/.bashrc  e.g: vim ~/.bashrc 
    - add export PATH=$PATH:/path/to/dir
    - then restart your computer. Be aware that if you edit ~/.bashrc  as root, your environment variable you added will work only for root
только я
источник
0

Это однострочник . Это добавляет строку к .bashrc. Строка будет проверять, был ли каталог уже добавлен в путь, и добавляться, если нет. Это предотвратит дублирование вашего каталога в пути каждый раз, когда вы создаете исходный код .bashrc.

echo "[[ \":\$PATH:\" != *\":$(pwd)/path/to/add:\"* ]] && export PATH=\"\${PATH:+\${PATH}}:$(pwd)/path/to/add\"" >> ~/.bashrc

source ~/.bashrc
sr9yar
источник