Змінна $PATH
— це один з непомітних, але важливих елементів у системі Linux. Вона тихо впливає на те, як ви працюєте з комп’ютером, і розуміння її ролі є ключовим. Давайте розберемося, як вона функціонує і як її можна налаштувати.
Що таке $PATH
в Linux і як вона працює?
Коли ви вводите команду в терміналі та натискаєте Enter, запускається цілий ряд процесів, перш ніж команда буде виконана.
Bash, як типова оболонка в більшості дистрибутивів Linux, аналізує введений вами текстовий рядок. Вона ідентифікує назви команд, їхні параметри, перенаправлення та інше. Потім вона шукає відповідні виконувані файли для цих команд і запускає їх з потрібними параметрами.
Першим кроком є перевірка, чи є команда вбудованою в саму оболонку. Якщо так (так звана “вбудована команда”), додатковий пошук не потрібен.
Вбудовані команди легко знайти, бо вони є невід’ємною частиною оболонки. Це як інструменти, які завжди під рукою.
Але якщо потрібен інший “інструмент”, його треба пошукати. Змінна середовища $PATH
і є тим “місцем”, де оболонка шукає ці інструменти, зберігаючи список директорій та порядок їх обходу.
Щоб перевірити, чи є команда вбудованою, псевдонімом, функцією, або окремим файлом, використовуйте команду type
, як показано нижче:
type clear
type cd
Результат показує, що clear
— це виконуваний файл, який знаходиться у /usr/bin
. Може існувати кілька версій цієї команди, але оболонка використовує першу знайдену.
З іншого боку, cd
є вбудованою командою оболонки.
Перегляд вашого $PATH
Переглянути вміст вашого $PATH
дуже просто. Скористайтеся командою echo
, щоб вивести значення змінної:
echo $PATH
Результатом буде список шляхів до директорій, розділених двокрапкою (:
). Оболонка шукає файли зліва направо, перевіряючи кожну директорію на наявність виконуваного файлу.
Ось приклад типового списку директорій:
/usr/local/sbin
/usr/local/bin
/usr/sbin
/usr/bin
/sbin
/bin
/usr/ігри
/usr/local/games
/snap/bin
Важливо зазначити, що пошук не починається з поточного каталогу. Оболонка переглядає лише ті директорії, які є в списку $PATH
.
Якщо поточного каталогу немає в $PATH
, він не буде врахований при пошуку. Також, якщо у вас є програми в директоріях, яких немає в шляху, оболонка їх не знайде.
Для прикладу, уявімо, що у нас є невелика програма rf
, яка виводить шлях до своєї директорії. Одна версія розташована в /usr/local/bin
, а новіша — у /dave/work
.
Команда which
показує, яку версію програми знайде оболонка:
which rf
Оболонка повідомляє, що знайшла версію програми в директорії, яка є в шляху, а саме в /usr/local/bin
.
Запускаємо програму командою:
rf
Працює версія 1.0, як і очікувалося.
Щоб запустити іншу версію програми rf
, потрібно вказати повний шлях до виконуваного файлу:
./work/rf
Тепер запускається версія 1.1. Якщо ви хочете використовувати цю версію за замовчуванням, ви можете скопіювати її в /usr/local/bin
, замінивши стару версію.
Уявіть, що ви розробляєте нову версію програми rf
, і вам потрібно часто її запускати під час розробки та тестування. Ви не хочете копіювати невипущену збірку в робоче середовище.
Або, можливо, ви завантажили нову версію програми і хочете її перевірити перед тим, як зробити загальнодоступною.
Якщо додати робочий каталог до шляху, оболонка почне знаходити вашу версію. При цьому, ця зміна торкнеться лише вас, інші користувачі продовжать використовувати версію з /usr/local/bin
.
Додавання каталогу до $PATH
Для того, щоб додати каталог до $PATH
, використовуйте команду export
. Коли оболонка знаходить виконуваний файл, вона припиняє пошук, тому варто впевнитись, що спочатку перевіряється ваша директорія.
Наприклад, для додавання каталогу /home/dave/work
на початок $PATH
:
export PATH=/home/dave/work:$PATH
Ця команда змінює значення змінної $PATH
, додаючи на початок новий каталог, а потім зберігаючи поточне значення $PATH
.
Перший PATH
без знака $
, оскільки ми встановлюємо для нього значення. Другий $PATH
зі знаком долара, бо ми використовуємо його поточне значення. Зверніть увагу на двокрапку :
, яка розділяє новий каталог і поточний вміст $PATH
.
Поглянемо на оновлений шлях:
echo $PATH
Як видно, наш каталог /home/dave/work
додано на початок $PATH
.
Тепер перевіримо, чи знайдеться першою наша версія rf
:
which rf
Тепер запускаємо програму, і бачимо, що використовується наша версія:
rf
Оболонка виконує версію 1.1 з /home/dave/work
.
Щоб додати каталог в кінець $PATH
, потрібно змінити порядок в команді:
export PATH=$PATH:/home/dave/work
Збереження змін
Зміни, внесені в $PATH
, будуть втрачені при закритті вікна терміналу. Для збереження їх потрібно додати команду export
до конфігураційного файлу.
Команда export
, розміщена у файлі .bashrc
, встановлює шлях при кожному відкритті вікна терміналу. Такі сесії називаються інтерактивними.
Раніше, для встановлення $PATH
при вході в термінал, використовували файл .profile
.
Проте, якщо додати команду export
в файли .bashrc
або .profile
, шлях правильно встановлюється як для інтерактивних сесій, так і для входу в термінал. Ваш досвід може відрізнятися. Тому ми покажемо, як зробити це в обох файлах.
Для редагування файлу .bashrc
в домашній директорії виконайте команду:
gedit .bashrc
Відкриється редактор gedit
з завантаженим файлом .bashrc
.
Прокрутіть файл вниз і додайте ту ж команду export
, яку ми використовували раніше:
export PATH=/home/dave/work:$PATH
Збережіть файл. Потім або закрийте та відкрийте вікно терміналу, або виконайте команду . .bashrc
:
. .bashrc
Перевірте шлях командою echo
:
echo $PATH
Тепер каталог /home/dave/work
буде доданий на початок шляху.
Аналогічно, для редагування файлу .profile
, виконайте команду:
gedit .profile
Відкриється редактор gedit
з завантаженим файлом .profile
.
Додайте команду export
в кінець файлу і збережіть його. Для того, щоб зміни набули чинності, потрібно вийти з системи та знову ввійти, або виконати команду . .profile
:
. .profile
Встановлення шляху для всіх користувачів
Щоб встановити шлях для всіх користувачів системи, можна відредагувати файл /etc/profile
.
Для цього потрібно скористатись sudo
:
sudo gedit /etc/profile
Додайте команду export
в кінець файлу.
Збережіть та закрийте файл. Зміни набудуть чинності для інших користувачів при наступному вході в систему.
Важливе зауваження з безпеки
Слід бути дуже обережним, щоб випадково не додати двокрапку “:” на початку або в кінці $PATH
.
Якщо це трапиться, спочатку буде проводитися пошук у поточному каталозі, що створює загрозу безпеці. Уявіть, що ви завантажили архівний файл, розпакували його, а в ньому знову архівний файл. Ви викликаєте команду unzip
, щоб розпакувати новий архів.
Якщо в першому архіві був виконуваний файл під назвою unzip
, то замість справжньої програми unzip
буде запущена шкідлива версія. Це станеться тому, що оболонка спочатку шукає виконуваний файл в поточному каталозі.
Тому, будьте уважні при введенні команд export
. Команда echo $PATH
дозволить перевірити правильність їх введення.