Как использовать команду which в Linux
Команда Linux what
идентифицирует исполняемый двоичный файл, который запускается, когда вы вводите команду в оболочку. Если на вашем компьютере установлены разные версии одной и той же программы, вы можете использовать what
, чтобы узнать, какую из них будет использовать оболочка.
Двоичные файлы и пути
Когда вы пытаетесь запустить программу или команду из окна терминала, оболочка (обычно Bash в современных дистрибутивах) должна найти эту команду и запустить ее. Некоторые команды, такие как cd, history и pwd, встроены в оболочку, поэтому Bash не нужно слишком много работать, чтобы найти их.
Но как Bash находит другие команды, программы и внешние автономные двоичные файлы? Ну, Bash использует путь, который на самом деле представляет собой набор путей, каждый из которых указывает на каталог. Затем он ищет в каждом из этих каталогов исполняемый файл, соответствующий команде или программе, которую вы пытаетесь запустить. Когда он находит его, Bash запускает его и прекращает поиск.
Вы можете использовать echo
, чтобы проверить переменную среды 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.
Какая команда
Проблема, которую мы продемонстрировали выше, заключается в том, почему была разработана команда what
.
В этом примере мы будем использовать what
и передадим имя исследуемой программы в качестве параметра командной строки:
which htg
который
сообщает, что он нашел версию htg
в каталоге /usr/local/bin
. Поскольку это расположение указано в пути перед каталогом, в который мы переместили обновленный htg
, Bash использует эту более раннюю версию программы.
Однако, если мы используем параметр -a
(все), как показано ниже, который
продолжает поиск, даже если находит совпадение:
which -a htg
Затем он перечисляет все совпадения в любом из каталогов пути.
Итак, проблема в том, что в каталоге есть более ранняя версия программы, которая также находится в патче. И этот каталог ищется перед каталогом, в который мы закинули новую версию программы.
Для проверки мы можем ввести следующее и явно запустить каждую версию программы:
/usr/local/bin/htg
/usr/bin/htg
Это объясняет проблему, и решение простое.
На самом деле, у нас есть варианты. Мы можем либо удалить старую версию в каталоге /use/local/bin
, либо переместить ее из /usr/bin
в /usr/local/bin
.
Смотреть эти результаты
Два результата не обязательно означают два бинарных файла.
Давайте рассмотрим пример, в котором мы будем использовать команду what
с параметром -a
(все) и искать версии less
программа:
which -a less
который
сообщает о двух местах, где находится версия программы less
, но так ли это? Было бы странно иметь две разные версии (или одну и ту же версию в разных местах) less
, установленные на компьютере с Linux. Итак, мы не собираемся принимать вывод what
. Вместо этого давайте копнем немного глубже.
Мы можем использовать параметры ls
, -l
(длинный список) и -h
(удобочитаемый), чтобы увидеть, что происходит:
ls -lh /usr/bin/less
Размер файла сообщается как девять байт! Это определенно не полная копия less
.
Первый символ в списке — «л». Обычный файл будет иметь дефис (-) в качестве первого символа. Символ «l» означает символическую ссылку. Если вы пропустили эту деталь, символ -->
также указывает, что это символическая ссылка, которую вы можете рассматривать как своего рода ярлык. Этот указывает на копию less
в /bin
.
Давайте попробуем еще раз с версией less
в /bin
:
ls -lh /bin/less
Эта запись, очевидно, является «настоящим» бинарным исполняемым файлом. Первый символ в списке — дефис (-), что означает, что это обычный файл, а размер файла — 167 КБ. Итак, установлена только одна копия less
, но на нее есть символическая ссылка из другого каталога, которую Bash также находит при поиске пути.
Проверка нескольких команд одновременно
Вы можете передать несколько программ и команд what
, и он проверит их по порядку.
Например, если вы наберете:
which ping cat uptime date head
который
работает со списком программ и команд, которые вы ему предоставили, и выводит результат для каждой из них.
Какой какой?
Если вы так склонны, вы также можете использовать what
сам по себе, набрав следующее:
which which
Если не считать любопытства в файловой системе Linux, который
наиболее полезен, когда вы ожидаете от команды или программы одного набора действий, а получаете другой.
В этих случаях вы можете использовать what
, чтобы убедиться, что запускаемая Bash команда является именно той, которую вы хотите использовать.
Linux Commands | ||
Files | tar · pv · cat · tac · chmod · grep · diff · sed · ar · man · pushd · popd · fsck · testdisk · seq · fd · pandoc · cd · $PATH · awk · join · jq · fold · uniq · journalctl · tail · stat · ls · fstab · echo · less · chgrp · chown · rev · look · strings · type · rename · zip · unzip · mount · umount · install · fdisk · mkfs · rm · rmdir · rsync · df · gpg · vi · nano · mkdir · du · ln · patch · convert · rclone · shred · srm · scp · gzip · chattr · cut · find · umask · wc | |
Processes | alias · screen · top · nice · renice · progress · strace · systemd · tmux · chsh · history · at · batch · free · which · dmesg · chfn · usermod · ps · chroot · xargs · tty · pinky · lsof · vmstat · timeout · wall · yes · kill · sleep · sudo · su · time · groupadd · usermod · groups · lshw · shutdown · reboot · halt · poweroff · passwd · lscpu · crontab · date · bg · fg · pidof · nohup · pmap | |
Networking | netstat · ping · traceroute · ip · ss · whois · fail2ban · bmon · dig · finger · nmap · ftp · curl · wget · who · whoami · w · iptables · ssh-keygen · ufw · arping · firewalld |
RELATED: Best Linux Laptops for Developers and Enthusiasts