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

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

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

Двоїчні файли та шляхи

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

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

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

echo $ PATH

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

  • /usr/local/sbin
  • /usr/local/bin
  • /usr/sbin
  • /usr/bin
  • /sbin
  • /bin
  • /user/games
  • /usr/local/games
  • /snap/bin

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

Дивитися ці шляхи

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


./htg

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

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

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

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

sudo mv htg / usr / bin

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


HTG

Щось запускається, але це не наша нова, оновлена програма. Швидше, це стара версія 1.2.105.

Команда

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

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

htg


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

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

який-htg

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

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


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

/ USR/місцеві/бен/HTG

/ USR/бен/HTG

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

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


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

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

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

який менше

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

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

ls -lh / usr / bin / less

Розмір файла становить дев'ять байтів! Це безумовно не повна копія less.

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

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

ls -lh / bin / less

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

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

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

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

який пінг кішка

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

Що є що?

Якщо ви так схильні, ви також можете використовувати, which на себе, набравши наступне:

який-який

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

Ви можете використовувати те, which у цих випадках для перевірки того, що команда Bash запускає саме ту, яку ви хочете використовувати.