У світі Linux, команда ‘which’ є надзвичайно корисною для визначення точного місця розташування виконуваних файлів, які активуються при введенні певної команди в терміналі. Якщо на вашому комп’ютері встановлено кілька версій однієї і тієї ж програми, ‘which’ допоможе з’ясувати, яку саме версію використовує оболонка.
Принцип Дії: Шляхи та Двійкові Файли
Коли ви набираєте команду в терміналі, оболонка (наприклад, Bash) має знайти і виконати відповідний файл. Деякі команди, як cd, history, та pwd, є вбудованими, тому їх пошук не становить труднощів для Bash.
А як же Bash знаходить інші програми та зовнішні виконувані файли? Для цього існує змінна середовища $PATH
. Вона містить список каталогів, де Bash шукає виконуваний файл, що відповідає введеній команді. Пошук відбувається по черзі в кожному каталозі, і як тільки відповідний файл знайдено, він виконується, а пошук припиняється.
Щоб побачити вміст змінної $PATH
, скористайтеся командою:
echo $PATH
Зазвичай, каталоги в шляху розділені двокрапками (:). Приклад типового шляху:
/usr/local/sbin
/usr/local/bin
/usr/sbin
/usr/bin
/sbin
/bin
/usr/games
/usr/local/games
/snap/bin
Зверніть увагу, що існує кілька папок з назвами `/sbin` та `/bin`, що може викликати деяку плутанину.
Приклад з Програмою htg
Припустимо, у вас є оновлена версія програми під назвою `htg`, яка знаходиться у поточному каталозі. Запустити її можна командою:
./htg
Програма просто виводить номер версії. Щоб запускати цю програму з будь-якого каталогу, перемістимо її до `/usr/bin`:
sudo mv htg /usr/bin
Спробуємо запустити програму, ввівши просто `htg`:
htg
Виявляється, запускається стара версія програми. Ось тут і стає в нагоді команда ‘which’.
Роль Команди ‘which’
Саме для вирішення таких проблем, коли потрібно знати точне місцезнаходження виконуваного файлу, і була створена команда ‘which’.
Використаємо ‘which’ для програми ‘htg’:
which htg
‘which’ повідомляє, що знайшла версію `htg` в `/usr/local/bin`. Оскільки цей каталог знаходиться в шляху раніше, ніж `/usr/bin`, саме цю версію використовує Bash.
Використання опції `-a` дозволяє ‘which’ показати всі знайдені екземпляри:
which -a htg
Тепер видно, що існує стара версія програми, яка перешкоджає виконанню нової версії. Можна явно запустити кожну версію:
/usr/local/bin/htg
/usr/bin/htg
Можна видалити стару версію з `/usr/local/bin` або перемістити нову версію з `/usr/bin` до `/usr/local/bin`.
Символічні Посилання
Іноді вивід ‘which’ може вводити в оману. Розглянемо приклад з командою `less`:
which -a less
На перший погляд, здається, що є дві версії `less`. Але чи це так? Перевіримо за допомогою `ls`:
ls -lh /usr/bin/less
Розмір файлу лише 9 байт! Це точно не виконуваний файл. Перший символ “l” вказує на символічне посилання, аналогічне ярлику. Символ `->` також підтверджує це. Посилання веде до `/bin/less`.
ls -lh /bin/less
Тут ми бачимо звичайний файл розміром 167 КБ. Отже, встановлено лише одна копія `less`, а з іншого каталогу є символічне посилання на неї.
Перевірка Кілька Команд
‘which’ може перевіряти кілька команд одночасно:
which ping cat uptime date head
Команда обробить кожну з наданих команд і виведе результат.
‘which which’?
З цікавості можна спробувати:
which which
Основна користь команди ‘which’ полягає в тому, щоб з’ясувати, чому команда поводиться не так, як ви очікуєте. Це допомагає переконатися, що Bash запускає саме ту програму, яку ви хочете використовувати.