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


882

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

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

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

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

Ответы:


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
  • удар
  • тире

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

связанные с

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


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

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 , возможно, поэтому


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

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


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и поместить туда свои скрипты.


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


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

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


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/

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


Вам на самом деле не нужно перезагружать компьютер. Выйти и вернуться снова достаточно. Это довольно элегантное решение, поскольку очень легко отменить любые изменения без необходимости редактировать файлы. Также легко указать оператор 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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.