Как добавить каталог в ваш PATH в Linux
PATH
— один из бесшумных манипуляторов в фоновом режиме вашего компьютера с Linux. Это незаметно влияет на ваш пользовательский опыт, но в этом нет ничего подозрительного. Мы объясним, что он делает и как вы можете его настроить.
Что такое $PATH в Linux и как он работает?
Когда вы вводите команду в окне терминала и нажимаете Enter, вы запускаете довольно много действий еще до того, как ваша команда будет выполнена.
Bash — это оболочка по умолчанию в большинстве дистрибутивов Linux. Он интерпретирует введенную вами строку текста и идентифицирует имена команд, смешанные с параметрами, каналами, перенаправлениями и всем остальным. Затем он находит исполняемые двоичные файлы для этих команд и запускает их с указанными вами параметрами.
Первый шаг, который оболочка предпринимает для поиска исполняемого файла, — это определение того, задействован ли вообще двоичный файл. Если используемая вами команда находится в самой оболочке («встроенная оболочка»), дальнейший поиск не требуется.
Встроенные оболочки легче всего найти, потому что они являются неотъемлемой частью оболочки. Это как иметь их на поясе с инструментами — они всегда с вами.
Однако, если вам нужен какой-либо из ваших других инструментов, вам придется порыться в мастерской, чтобы найти его. Это на вашем верстаке или настенной вешалке? Это то, что делает переменная окружения PATH
. Он содержит список мест, которые ищет оболочка, и порядок, в котором они будут искаться.
Если вы хотите узнать, является ли команда встроенной оболочкой, псевдонимом, функцией или отдельным двоичным файлом mv /work/unfile, вы можете использовать команду type
, как показано ниже:
type clear
type cd
Это говорит нам о том, что clear
— это двоичный файл, и первый найденный в пути файл находится в /usr/bin
. На вашем компьютере может быть установлено несколько версий clear
, но оболочка попытается использовать именно эту.
Неудивительно, что cd
является встроенной оболочкой.
Список вашего $PATH
Легко увидеть, что находится на вашем пути. Просто введите следующее, чтобы использовать команду echo
и вывести значение, хранящееся в переменной PATH
:
echo $PATH
Результатом является список расположений файловой системы, разделенных двоеточием (:
). Оболочка выполняет поиск слева направо по пути, проверяя каждое местоположение файловой системы на наличие соответствующего исполняемого файла для выполнения вашей команды.
Мы можем пройтись по списку, чтобы увидеть местоположения файловой системы, в которых будет выполняться поиск, и порядок, в котором они будут выполняться:
/usr/local/sbin
/usr/local/bin
/usr/sbin
/usr/bin
/sbin
/bin
/usr/игры
/usr/local/games
/snap/bin
Что может быть неочевидно сразу, так это то, что поиск начинается не в текущем рабочем каталоге. Скорее, он работает через перечисленные каталоги и только перечисленные каталоги.
Если текущий рабочий каталог не указан в вашем пути, он не будет найден. Кроме того, если у вас есть команды, хранящиеся в каталогах, не указанных в пути, оболочка их не найдет.
Чтобы продемонстрировать это, мы создали небольшую программу под названием rf
. При выполнении rf
печатает имя каталога, из которого он был запущен, в окне терминала. Он находится в /usr/local/bin
. У нас также есть более новая версия в каталоге /dave/work
.
Мы вводим следующую команду what
, чтобы показать нам, какую версию нашей программы найдет и использует оболочка:
which rf
Оболочка сообщает, что найденная версия — это версия в каталоге, указанном в пути.
Мы вводим следующее, чтобы запустить его:
rf
Версия 1.0 rf
работает и подтверждает, что наши ожидания были правильными. Найденная и выполненная версия находится в /usr/local/bin
.
Чтобы запустить любую другую версию rf
на этом компьютере, нам нужно указать путь к исполняемому файлу в командной строке, как показано ниже:
./work/rf
Теперь, когда мы сообщили оболочке, где найти версию rf
, которую мы хотим запустить, она использует версию 1.1. Если мы предпочитаем эту версию, мы можем скопировать ее в каталог /usr/local/bin
и перезаписать старую.
Допустим, мы разрабатываем новую версию rf
. Нам нужно будет часто запускать его по мере разработки и тестирования, но мы не хотим копировать невыпущенную сборку для разработки в живую среду.
Или, возможно, мы загрузили новую версию rf
и хотим провести ее проверочное тестирование, прежде чем сделать ее общедоступной.
Если мы добавим наш рабочий каталог в путь, мы заставим оболочку найти нашу версию. И это изменение затронет только нас — другие по-прежнему будут использовать версию rf
в /usr/local/bin
.
Добавление каталога в ваш $PATH
Вы можете использовать команду export
, чтобы добавить каталог в PATH
. Затем этот каталог включается в список местоположений файловой системы, которые ищет оболочка. Когда оболочка находит соответствующий исполняемый файл, она прекращает поиск, поэтому убедитесь, что она сначала выполняет поиск в вашем каталоге, а затем /usr/local/bin
.
Это легко сделать. В нашем примере мы вводим следующее, чтобы добавить наш каталог в начало пути, чтобы это было первое место поиска:
export PATH=/home/dave/work:$PATH
Эта команда устанавливает PATH
равным каталогу, который мы добавляем, /home/dave/work
, а затем всему текущему пути.
Первый PATH
не имеет знака доллара ($
). Мы устанавливаем значение для PATH
. Последний PATH
имеет знак доллара, потому что мы ссылаемся на содержимое, хранящееся в переменной PATH
. Также обратите внимание на двоеточие (:
) между новым каталогом и именем переменной PATH
.
Давайте посмотрим, как теперь выглядит путь:
echo $PATH
Наш каталог /home/dave/work
добавляется в начало пути. Предоставленное двоеточие отделяет его от остальной части пути.
Мы вводим следующее, чтобы убедиться, что наша версия rf
найдена первой:
which rf
Доказательство в пудинге выполняется rf
, как показано ниже:
rf
Оболочка находит версию 1.1 и запускает ее из /home/dave/work
.
Чтобы добавить наш каталог в конец пути, мы просто перемещаем его в конец команды, например так:
export PATH=$PATH:/home/dave/work
Сделать изменения постоянными
Как сказала Бет Брук-Марчиниак: «Успех — это хорошо, но успех мимолетен». В тот момент, когда вы закроете окно терминала, все изменения, внесенные вами в PATH
, исчезнут. Чтобы сделать их постоянными, вы должны поместить команду export
в файл конфигурации.
Когда вы помещаете команду export
в файл .bashrc
, она устанавливает путь каждый раз, когда вы открываете окно терминала. В отличие от сеансов SSH
, для которых необходимо войти в систему, такие сеансы называются интерактивными.
Раньше вы помещали команду export
в свой файл .profile
, чтобы указать путь для входа в сеансы терминала.
Однако мы обнаружили, что если поместить команду export
в файлы .bashrc
или .profile
, она правильно установит путь для обоих интерактивных и войдите в сеансы терминала. Ваш опыт может быть другим. Чтобы справиться со всеми возможными случаями, мы покажем вам, как это сделать в обоих файлах.
Используйте следующую команду в каталоге /home
, чтобы отредактировать файл .bashrc
:
gedit .bashrc
Откроется редактор gedit
с загруженным файлом .bashrc
.
Прокрутите файл до конца и добавьте следующую команду экспорта, которую мы использовали ранее:
export PATH=/home/dave/work:$PATH
Сохраните файл. Затем либо закройте и снова откройте окно терминала, либо используйте команду dot
для чтения файла .bashrc
следующим образом:
. .bashrc
Затем введите следующую команду echo
, чтобы проверить путь:
echo $PATH
Это добавит каталог /home/dave/work
в начало пути.
Процесс добавления команды в файл .profile
такой же. Введите следующую команду:
gedit .profile
Редактор gedit
запускается с загруженным файлом .profile
.
Добавьте команду export
в конец файла и сохраните ее. Закрытие и открытие нового окна терминала недостаточно для принудительного повторного чтения файла .profile
. Чтобы новые настройки вступили в силу, вы должны выйти и снова войти в систему или использовать команду dot
, как показано ниже:
. .profile
Установка пути для всех
Чтобы установить путь для всех, кто использует систему, вы можете отредактировать файл /etc/profile
.
Вам нужно будет использовать sudo
следующим образом:
sudo gedit /etc/profile
Когда запустится редактор gedit
, добавьте команду экспорта в конец файла.
Сохраните и закройте файл. Изменения вступят в силу для других при следующем входе в систему.
Примечание о безопасности
Убедитесь, что вы случайно не добавили двоеточие в начале пути «:
», как показано ниже.
Если вы это сделаете, сначала будет выполняться поиск в текущем каталоге, что создает угрозу безопасности. Допустим, вы загрузили архивный файл и распаковали его в каталог. Вы смотрите на файлы и видите еще один заархивированный файл. Вы вызываете unzip еще раз, чтобы извлечь этот архив.
Если первый архив содержал исполняемый файл с именем unzip
, который был вредоносным исполняемым файлом, вы случайно запустили его вместо настоящего исполняемого файла unzip
. Это произойдет потому, что оболочка сначала будет искать в текущем каталоге.
Поэтому всегда будьте осторожны при вводе команд export
. Используйте echo
PATH, чтобы просмотреть их и убедиться, что они именно такие, как вы хотите.
Linux Commands | ||
Files | tar · pv · cat · tac · chmod · grep · diff · sed · ar · man · pushd · popd · fsck · testdisk · seq · fd · pandoc · cd · $PATH · awk · join · jq · fold · uniq · journalctl · tail · stat · ls · fstab · echo · less · chgrp · chown · rev · look · strings · type · rename · zip · unzip · mount · umount · install · fdisk · mkfs · rm · rmdir · rsync · df · gpg · vi · nano · mkdir · du · ln · patch · convert · rclone · shred · srm · scp · gzip · chattr · cut · find · umask · wc | |
Processes | alias · screen · top · nice · renice · progress · strace · systemd · tmux · chsh · history · at · batch · free · which · dmesg · chfn · usermod · ps · chroot · xargs · tty · pinky · lsof · vmstat · timeout · wall · yes · kill · sleep · sudo · su · time · groupadd · usermod · groups · lshw · shutdown · reboot · halt · poweroff · passwd · lscpu · crontab · date · bg · fg · pidof · nohup · pmap | |
Networking | netstat · ping · traceroute · ip · ss · whois · fail2ban · bmon · dig · finger · nmap · ftp · curl · wget · who · whoami · w · iptables · ssh-keygen · ufw · arping · firewalld |
RELATED: Best Linux Laptops for Developers and Enthusiasts