Як використовувати команду which в Linux

У світі 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 запускає саме ту програму, яку ви хочете використовувати.