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

Команда Linux which визначає виконуваний двійковий файл, який запускається, коли ви вводите команду в оболонку. Якщо у вас на комп’ютері є різні версії однієї і тієї ж програми, ви можете скористатися якою, щоб дізнатися, яку з них використовуватиме оболонка.

Бінарні файли та шляхи

Коли ви намагаєтеся запустити програму або команду з вікна терміналу, оболонка (зазвичай, Bash на сучасних дистрибутивах) має знайти цю команду та запустити її. Деякі команди, наприклад компакт-диск, історії, і Pwd, вбудовані в оболонку, тому Bash не доведеться надто працювати, щоб знайти їх.

Але як Bash знаходить інші команди, програми та зовнішні автономні двійкові файли? Що ж, Bash використовує шлях, який насправді є набір шляхів, кожен з яких вказує на каталог. Потім він шукає в кожному з цих каталогів виконуваний файл, який відповідає команді або програмі, яку ви намагаєтеся запустити. Коли він знаходить його, Bash запускає його та припиняє пошук.

Ви можете використовувати echo, щоб перевірити змінну середовища $PATH і побачити каталоги на вашому шляху. Для цього введіть наступне, а потім натисніть Enter:

echo $PATH

Список вихідних даних розділяє кожен шлях двокрапками (:). На комп’ютері, який ми використовуємо, Bash шукатиме такі каталоги в такому порядку:

/usr/local/sbin
/usr/local/bin
/usr/sbin
/usr/bin
/sbin
/bin
/користувач/ігри
/usr/local/games
/snap/bin

У файловій системі є багато папок під назвою /sbin і /bin, що може призвести до певної плутанини.

  6 найкращих клієнтів Telegram Chat для Linux

Дивіться Ці шляхи

Скажімо, у нас є оновлена ​​версія програми під назвою htg. Він знаходиться в нашому поточному каталозі, і ми можемо запустити його, ввівши таку команду:

./htg

The

Це не дуже велика програма — вона просто друкує номер версії, а потім закривається. Нова версія 1.2.138.

Щоб запустити програму в поточному робочому каталозі, ви повинні ввести «./» перед назвою програми, щоб Bash знав, де її знайти.

Оскільки ми хочемо запустити цю конкретну програму з будь-якого каталогу, ми збираємося перемістити виконуваний файл у каталог /usr/bin. Bash знайде цю програму в шляху і запустить її для нас.

Нам не потрібен виконуваний файл у нашому поточному каталозі, а також нам не потрібно вводити «./» перед назвою програми, як показано нижче:

sudo mv htg /usr/bin

The

Тепер давайте спробуємо запустити програму, ввівши:

htg

The

Щось працює, але це не наша нова, оновлена ​​програма. Скоріше, це старіша версія, 1.2.105.

Команда котра

Проблема, яку ми продемонстрували вище, полягає в тому, чому команда which був розроблений.

У цьому прикладі ми використовуємо which і передаємо назву програми, яку ми досліджуємо, як параметр командного рядка:

which htg

The

який повідомляє, що знайшов версію htg у каталозі /usr/local/bin. Оскільки це розташування з’являється в шляху до каталогу, до якого ми перемістили оновлений htg, Bash використовує цю попередню версію програми.

Однак, якщо ми використовуємо параметр -a (усі), як показано нижче, який продовжує пошук, навіть якщо знайде відповідність:

which -a htg

The

Потім він перераховує всі збіги в будь-якому з каталогів на шляху.

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

Отже, проблема полягає в тому, що в каталозі, який також міститься у виправленні, є попередня версія програми. І цей каталог шукається до каталогу, в який ми перекинули нову версію програми.

Щоб перевірити, ми можемо ввести наступне та явно запустити кожну версію програми:

/usr/local/bin/htg
/usr/bin/htg

Це пояснює проблему, а рішення просте.

Насправді, у нас є варіанти. Ми можемо видалити стару версію в каталозі /use/local/bin або перемістити її з /usr/bin до /usr/local/bin.

Дивіться ці результати

Два результати не обов’язково означають два бінарних файли.

Давайте розглянемо приклад, у якому ми будемо використовувати команду which з опцією -a (all) і шукатимемо версії програми less:

which -a less

The

який повідомляє про два місця, у яких міститься версія меншої програми, але чи це правда? Було б дивно мати дві різні версії (або ту саму версію в кількох місцях) менш встановлених на комп’ютері Linux. Отже, ми не збираємося приймати вихідні дані з яких. Замість цього давайте копаємо глибше.

Ми можемо використовувати параметри ls, -l (довгий список) і -h (читатий людиною), щоб побачити, що відбувається:

ls -lh /usr/bin/less

The

Розмір файлу вказано як дев’ять байт! Це точно не повна копія менше.

Перший символ списку — «л». Звичайний файл мав би дефіс (-) як перший символ. «l» — це символ, що означає символічне посилання. Якщо ви пропустили цю деталь, символ –> також вказує, що це a символічне посилання, який ви можете розглядати як свого роду ярлик. Це вказує на копію less в /bin.

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

Спробуємо ще раз із версією less в /bin:

ls -lh /bin/less

The

Очевидно, що цей запис є «справжнім» двійковим виконуваним файлом. Першим символом списку є дефіс (-), що означає, що це звичайний файл, а розмір файлу становить 167 КБ. Таким чином, встановлено лише одну копію менше, але є символічне посилання на неї з іншого каталогу, яке Bash також знаходить, коли шукає шлях.

Перевірка кількох команд одночасно

Ви можете передати кілька програм і команд, яким, і він перевірить їх по порядку.

Наприклад, якщо ви введете:

which ping cat uptime date head

The

який працює зі списком програм і команд, які ви йому надали, і перераховує результат для кожної з них.

Який який який?

Якщо ви так прагнете, ви також можете використовувати це самостійно, ввівши наступне:

which which

Крім того, що можна шукати файлову систему Linux з цікавості, що є найкориснішим, коли ви очікуєте одного набору поведінки від команди або програми, але отримуєте інший.

У цих випадках ви можете використовувати це, щоб переконатися, що команда, яку запускає Bash, є тією, яку ви хочете використовувати.