sonyps4.ru

Добавить в переменную среды path linux. Переменные среды Path

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

Шаги

  1. 1 Найдите текущий путь, введя команду echo $PATH. Откроется список каталогов, как показано ниже (пример):
    • uzair@linux:~$ echo $PATH/home/uzair/bin:/usr/local/sbin:/usr/local/bin:/usr/bin:/bin:/usr/games
    • Примечание: каталоги разделены двоеточиями.
  2. 2 Временно добавьте: /sbin и:/usr/sbin: к текущему пути, введя команду:
    • uzair@linux:~$ export PATH=$PATH:/sbin/:/usr/sbin/
  3. 3 Для подтверждения того, что переменная PATH была изменена, введите команду:
    • uzair@linux:~$ echo $PATH/home/uzair/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
    • Помните, что внесенные изменения являются временными и будут отменены при перезагрузке системы.
  4. 4 Проверьте правильность работы программ с временной переменной.
  5. 5 Для внесения постоянных изменений в переменную PATH добавьте ту же строку в файл ~/.bashrc

Предупреждения

  • Изменение переменной PATH может привести к нестабильной работе операционной системы. Переменная используется для поиска исполняемых файлов. Если переменная настроена неправильно, то программы будут работать со сбоями или вообще не будут работать. Всегда проверяйте правильность работы программ с временной переменной перед тем, как записать изменения в файл ~/.bashrc.

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

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

Пути файлов в Linux

Файловая система Linux очень сильно отличается от Windows. Мы не будем рассматривать ее структуру, это было сделано ранее. Мы сосредоточимся на работе с файлами.

Самое главное отличие, в том что адрес файла начинается не с диска, например, C:\ или D:\ как это происходит в Windows, а с корня, корневого системного каталога, к которому подключены все другие. Его адрес - /. И тут нужно сказать про адреса. Пути файлов linux используют прямой слеш "/" для разделения каталогов в адресе, и это отличается от того, что вы привыкли видеть в Windows - \.

Например, если в Windows полный путь к файлу на рабочем столе выглядел C:\Users\Sergiy\Desktop\ то в путь файла в linux будет просто /home/sergiy/desktop/. С этим пока все просто и понятно. Но проблемы возникают дальше.

В операционной системе Linux может быть несколько видов путей к файлу. Давайте рассмотрим какие бывают пути в linux:

  • Полный, абсолютный путь linux от корня файловой системы - этот путь вы уже видели в примере выше, он начинается от корня "/" и описывает весь путь к файлу;
  • Относительный путь linux - это путь к файлу относительно текущей папки, такие пути часто вызывают путаницу.
  • Путь относительно домашний папки текущего пользователя. - путь в файловой системе, только не от корня, а от папки текущего пользователя.

Рассмотрим теперь подробнее как выглядят эти пути в linux, а также разберем несколько примеров, чтобы было окончательно понятно. Для демонстрации будем пользоваться утилитой ls, которая предназначена для просмотра содержимого каталогов.

Например, у нас есть такой каталог в домашней папке с четырьмя файлами в нем:

Вот так будет выглядеть полный путь linux к одному из файлов:

ls /home/sergiy/tmp/file1

Это уже относительный путь linux, который начинается от домашней папки, она обозначается ~/. Заметьте, не ~, а именно ~/. Дальше вы уже можете указывать подпапки, в нашем случае tmp:

Ну или путь файла в linux, относительно текущей папки:

Первая ссылка указывает на текущую папку (.), вторая (..) указывает на папку уровнем выше. Это открывает еще более широкие возможности для навигации по каталогам. Например, чтобы сослаться на файл в текущей папке можно использовать конструкцию:

Это бесполезно при просмотре содержимого файла. Но очень важно при выполнении программы. Поскольку программа будет сначала искаться в среде PATH, а уже потом в этой папке. А потому, если нужно запустить программу, которая находится в текущей папке и она называется точно также как и та что в каталоге /bin, то без явной ссылки что файл нужно искать в текущей папке ничего не получится.

Такие конструкции могут довольно часто встречаться при компиляции программ. Все эти символы и пути файлов linux вы можете применять не только в терминале, но и в любом файловом менеджере, что может быть очень удобно.

Но терминал Linux предоставляет еще более широкие возможности. Вы можете использовать простые символы замены прямо в адресах файлов или каталогов. Например, можно вывести все файлы, начинающиеся на f:

Или даже можно искать не только в папке tmp, а в любой подпапке домашней папки:

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

Выводы

Вот и все. Теперь вы знаете все что необходимо, чтобы не только правильно написать путь к файлу linux, но и выполнять более сложные действия, например, поиск файлов или навигация по каталогам с помощью команды cd. Если у вас остались вопросы, спрашивайте в комментариях!

Похожие записи:


К огда вы вводите команду в командной строке, вы в основном говорите оболочке запустить исполняемый файл с заданным именем. В Linux эти исполняемые программы, как ls, find, file и другие, как правило, живут в нескольких разных каталогов в вашей системе. Любой файл с исполняемыми разрешениями, хранящимися в этих каталогах, может быть запущен из любого места. Наиболее распространенные каталоги, которые содержат исполняемые программы /bin, /sbin, /usr/sbin, /usr/local/bin и /usr/local/sbin.

Но как оболочка узнает, в каких каталогах искать исполняемые программы или оболочка выполняет поиск по всей файловой системе?

Ответ прост. Когда вы вводите команду, оболочка ищет во всех каталогах, указанных в пользовательской переменной $PATH, исполняемый файл с таким именем.

В этой статье показано, как добавить каталоги в вашей переменной $PATH системы .

Что есть $PATHв Linux

Переменная окружающей среды $PATH является двоеточиями список каталогов, сообщает оболочке, какие каталоги для поиска исполняемых файлов.

Чтобы проверить, какие каталоги у вас есть в переменной $PATH, вы можете использовать команду printenv или echo:

Echo $PATH

Вывод будет выглядеть примерно так:

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin

Если у вас есть два исполняемых файла с одинаковым именем, расположенные в двух разных каталогах, оболочка запустит файл, который находится в каталоге, который стоит первым в $PATH.

Добавление каталога в ваш $PATH

Есть ситуации, когда вы можете захотеть добавить другие каталоги в переменную $PATH. Например, некоторые программы могут быть установлены в разных местах, или вы можете захотеть иметь выделенный каталог для ваших личных записей, но сможете запускать их без указания абсолютного пути к исполняемым файлам. Для этого вам просто нужно добавить каталог в свой $PATH.

Допустим, у вас есть каталог с именем, binрасположенный в вашем домашнем каталоге, в котором вы храните свои сценарии оболочки. Чтобы добавить каталог к ​​вашей переменной $PATH:

Команда export экспортирует измененную переменную в дочерние среды процессов оболочки.

Теперь вы можете запускать ваши скрипты, просто набрав имя исполняемого скрипта без указания полного пути к исполняемому файлу.

Однако это изменение носит временный характер и действует только в текущем сеансе оболочки.

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

  • Конфигурационные файлы глобальной оболочки, такие как /etc/environment и /etc/profile. Используйте этот файл, если вы хотите, чтобы новый каталог был добавлен всем системным пользователям $PATH.
  • Конфигурационные файлы для отдельных пользовательских оболочек. Например, если вы используете Bash, вы можете установить переменную $PATH в файле ~/.bashrc, а если вы используете Zsh – имя файла ~/.zshrc.

В этом примере мы установим переменную в файле ~/.bashrc. Откройте файл в текстовом редакторе и добавьте в конце следующую строку:

Nano ~/.bashrc

Export PATH="$HOME/bin:$PATH"

Сохраните файл и загрузите новое значение $PATH в текущий сеанс оболочки, используя :

Source ~/.bashrc

Чтобы подтвердить, что каталог был успешно добавлен, напечатайте его значение $PATH, набрав:

Echo $PATH

Заключение

Добавить новые каталоги в вашу пользовательскую или глобальную переменную $PATH довольно просто. Это позволяет выполнять команды и сценарии, хранящиеся в нестандартных местах, без необходимости вводить полный путь к исполняемому файлу.

Те же инструкции применимы для любого дистрибутива Linux, включая , CentOS, RHEL, Debian и Linux Mint.

Не стесняйтесь оставлять комментарии, если у вас есть какие-либо вопросы.

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

Таким образом:

Export PATH=~/opt/bin:$PATH

Export PATH=$PATH:~/opt/bin

11 ответов

Простой материал

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 внешние двойные кавычки breaks if PATH содержит пробелы или \[*? .

Итак, в оболочках, таких как тире, 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), но вы вряд ли столкнетесь с такими старыми оболочками в наши дни. Суб>

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

В частности, с точки зрения безопасности опасно добавлять пути к фронту, потому что, если кто-то может получить доступ на запись к вашему ~/opt/bin , они могут поместить для например, другой ls , который вы, вероятно, будете использовать вместо /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

это all , которое будет в вашем 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 . Чтобы добавить каталог /данные /myscripts в начало переменной окружения $PATH , используйте следующее:

PATH=/data/myscripts:$PATH

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

PATH=$PATH:/data/myscripts

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

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

$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 переменная среды.

В течение некоторого времени я сохранил со мной две функции 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

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

Пуленепробиваемый способ добавления /предварительной подготовки

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

Важным моментом является то, что даже если системные скрипты не используют это (интересно, почему) * 1 , пуленепробиваемый способ добавления пути (например, $HOME/bin) к переменной среды PATH

PATH="${PATH:+${PATH}:}$HOME/bin"

для добавления (вместо PATH="$PATH:$HOME/bin") и

PATH="$HOME/bin${PATH:+:${PATH}}"

для добавления (вместо PATH="$HOME/bin:$PATH")

Это позволяет избежать ложного ведущего /конечного двоеточия, когда $PATH изначально пуст, что может иметь нежелательные побочные эффекты и может стать кошмаром, неуловимо найти ( этот ответ вкратце рассматривает случай awk -way).

${parameter:+word}

Если параметр parameter имеет значение null или unset, ничего не заменяется, в противном случае заменяется слово word .

Таким образом, ${PATH:+${PATH}:} расширяется до: 1) ничего, если PATH имеет значение null или unset, 2) ${PATH}: , если установлен PATH .

Примечание . Это для bash.

* 1 Я только что нашел, что скрипты вроде devtoolset-6/enable действительно используют это, $ cat /opt/rh/devtoolset-6/enable # General environment variables export PATH=/opt/rh/devtoolset-6/root/usr/bin${PATH:+:${PATH}} ...

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

Для меня (в 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 .

Как вы уже знаете, при входе любого пользователя в систему для него запускается особый экземпляр оболочки — login shell. В процессе запуска в качестве login shell bash ищет следующие файлы:

  • /etc/profile
  • ~/.bash_profile
  • ~/.bash_login
  • ~/.profile

(в указанном порядке) и выполняет содержащиеся в них команды. Если bash запускается повторно из командной строки в интерактивном режиме (т. е. не для выполнения какой-то одиночной команды), то он находит файл ~/.bashrc и выполняет содержащиеся в нем команды. Впрочем, в дистрибутиве Mandrake файл ~/.bashrc вызывается и для login shell, а из него вызывается еще и общесистемный файл /etc/bashrc. Так что, как видите, тут возможны варианты.

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

Файлы /etc/profile и /etc/bashrc определяют общесистемные настройки пользовательской среды, а остальные перечисленные файлы определяют индивидуальную среду конкретного пользователя. Сравнительно небольшие добавления или исправления в индивидуальных файлах настройки, изменяющие значения, заданные по умолчанию, могут сделать значительно более приятной для вас работу в системе (о вкусах, как известно, не спорят, и вряд ли люди, которые определяли настройки по умолчанию, угадали ваши предпочтения). Поэтому давайте кратко рассмотрим основные переменные пользовательской среды и то, каким образом вы сами можете их изменять.

Вначале посмотрите переменные окружения, которые заданы по умолчанию. Как мы уже говорили в разд. 5.6 , это можно сделать с помощью команд set (и аналогичной ей команды typeset ) или env . Значение, присвоенное отдельной переменной, можно просмотреть с помощью команды echo $name , где name — имя переменной.

Из всех переменных, которые вы увидите по команде set , обычно меняют вид приглашения PS1 и перечень путей поиска PATH. О том, как поменять значения этих переменных, было подробно рассказано в разд. 5.6 . Если вы почему-либо пропустили этот раздел, загляните в него сейчас. Так что осталось только решить, в каком именно скрипте задать этим переменным новые значения. Рассмотрим этот вопрос на примере переменной PATH.

Переменная PATH формируется в двух скриптах: /etc/profile (пути, общие для всех пользователей) и в одном из пользовательских скриптов (например, в ~/.bash_profile), где к ранее сформированному перечню пользователь может добавить пути по своему желанию. Только не стоит делать это в файле ~/bashrc, так как последний перезапускается каждый раз при запуске второго, третьего и т. д. экземпляра оболочки. Для добавления пути в переменную PATH надо вписать в выбранный скрипт строку следующего вида (в этом примере в перечень добавляется путь /home/user/bin):

PATH=$PATH:/home/user/bin

Обратите внимание на то, что двоеточия в конце нет. И имейте в виду, что каталоги просматриваются в поисках нужного файла в том порядке, как они перечислены в переменной PATH.

В отличие от MS-DOS Linux не ищет исполняемый файл в текущем каталоге. Поэтому, если вы хотите, чтобы поиск производился и в текущем каталоге, надо добавить и этот каталог (напомним, что он имеет имя, состоящее из одной точки) в переменную PATH. Но имейте в виду, что с точки зрения безопасности добавлять текущий каталог в перечень путей поиска недопустимо, так как злоумышленник может поместить в один из доступных ему по записи каталогов вредоносную программу, названную именем одной из часто используемых системных утилит. И, когда вы запустите эту программу, считая, что запускаете системную утилиту, она может нанести большой вред вашей системе, тем более, если вы запустили ее от имени суперпользователя.

При желании можно слегка "украсить себе жизнь", включив цветной вывод в команде ls (если по умолчанию он черно-белый). Для этого редактируем файл /etc/bashrc, в который добавляем строку:

alias ls = "ls -F --color"

Кстати, если вы захотите, чтобы Midnight Comma nder в окне эмулятора терминала был цветным, а не черно-белым, то установите переменную COLORTERM :

COLORTERM = ; export COLORTERM

В. Костромин (kos at rus-linux dot net) - 8.8. Настройка окружения пользователя

Загрузка...