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