Команда 'which' в Linux: поиск команд

LinuxLinuxBeginner
Практиковаться сейчас

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

В этом практическом занятии (лабораторной работе) вы начнете путь как младший разработчик в компании TechCorp, которому поручено настроить новую среду разработки. Ваша задача - овладеть командой which, важным инструментом для поиска исполняемых файлов в переменной PATH системы. Этот навык окажется бесценным, когда вы будете ориентироваться в сложном мире разработки программного обеспечения и системного администрирования.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL linux(("Linux")) -.-> linux/BasicSystemCommandsGroup(["Basic System Commands"]) linux(("Linux")) -.-> linux/FileandDirectoryManagementGroup(["File and Directory Management"]) linux/BasicSystemCommandsGroup -.-> linux/echo("Text Display") linux/FileandDirectoryManagementGroup -.-> linux/which("Command Locating") subgraph Lab Skills linux/echo -.-> lab-215210{{"Команда 'which' в Linux: поиск команд"}} linux/which -.-> lab-215210{{"Команда 'which' в Linux: поиск команд"}} end

Понимание основ команды 'which'

По мере того, как вы привыкаете к своей новой роли в TechCorp, ваш руководитель команды просит вас проверить установку некоторых важных инструментов разработки. Команда which станет вашим основным инструментом для этой задачи.

Команда which используется для поиска исполняемого файла, связанного с заданной командой, путем просмотра каталогов, перечисленных в переменной окружения PATH.

Начнем с поиска компилятора gcc:

which gcc

Вы должны увидеть вывод, похожий на следующий:

/usr/bin/gcc

Этот вывод говорит вам, что исполняемый файл gcc находится в каталоге /usr/bin. Это означает, что когда вы вводите gcc в терминале, система выполнит файл, расположенный по адресу /usr/bin/gcc.

Теперь попробуем найти другой важный инструмент - python:

which python

Вы, возможно, увидите что-то вроде этого:

/usr/local/bin/python

Команда which просматривает каталоги, перечисленные в вашей переменной окружения PATH, и возвращает первое совпадение, которое находит. Если вы видите другой путь, не беспокойтесь - это просто означает, что Python установлен в другом месте на вашей системе.

Обработка несуществующих команд

Ваш руководитель команды упоминает, что TechCorp раньше использовала специальный инструмент сборки под названием techbuild. Давайте проверим, установлен ли он по-прежнему:

which techbuild

Вы, возможно, не увидите никакого вывода (Bash Shell), или же можете увидеть сообщение об ошибке, такое как techbuild not found (Zsh Shell).

Это происходит потому, что which не возвращает ничего, если не может найти команду в вашем PATH. Не пугайтесь отсутствия вывода - это команда сообщает вам, что techbuild не найден в любом из каталогов вашего PATH.

Для того чтобы это поведение было более явным, мы можем использовать простой скрипт оболочки. Здесь мы познакомимся с двумя новыми концепциями:

  1. Команда echo: Используется для вывода строки текста/строки на терминал.
  2. Оператор >: Используется для перенаправления вывода в файл.

Давайте создадим скрипт для проверки наличия techbuild:

echo '#!/bin/bash
if which techbuild >/dev/null 2>&1; then
  echo "techbuild is installed"
else
  echo "techbuild is not installed"
fi' > ~/check_techbuild.sh

Эта команда выполняет несколько действий:

  • Она использует echo для записи скрипта оболочки.
  • Содержимое скрипта заключено в одинарные кавычки.
  • Оператор > перенаправляет вывод echo в новый файл с именем check_techbuild.sh в вашем домашнем каталоге.

Теперь сделаем этот скрипт исполняемым и запустим его:

chmod +x ~/check_techbuild.sh
~/check_techbuild.sh

Этот скрипт выведет "techbuild is not installed", если команда не найдена.

Поиск нескольких установок

По мере настройки своей среды разработки вы понимаете, что TechCorp использует несколько версий Python для разных проектов. Опция -a команды which поможет вам найти все установленные версии команды:

which -a python

Вы, возможно, увидите такой вывод:

/usr/local/bin/python
/usr/bin/python
/bin/python

Этот вывод показывает, что на системе установлено несколько версий Python. Опция -a сообщает команде which вывести все совпадающие исполняемые файлы в PATH, а не только первый найденный.

Понимание этого аспекта очень важно, так как оно показывает все возможные исполняемые файлы Python, которые могут быть запущены в зависимости от настройки вашего PATH. Первый в списке исполняемый файл будет запущен, когда вы введете python в терминал.

Понимание приоритета переменной PATH

Ваш руководитель команды объясняет, что порядок каталогов в переменной PATH определяет, какая версия команды будет использоваться по умолчанию. Давайте посмотрим на вашу переменную PATH:

echo $PATH

Вы увидите список каталогов, разделенных двоеточиями. Например:

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

Порядок имеет значение: каталоги, перечисленные раньше, имеют более высокий приоритет. Это означает, что если в разных каталогах есть два исполняемых файла с одинаковым именем, будет использован тот, который находится в каталоге, который появляется первым в PATH.

Теперь давайте найдем все экземпляры команды ls:

which -a ls

Вы, возможно, увидите:

/usr/bin/ls
/bin/ls

Даже если /bin/ls перечислен последним, он может быть тем, который будет выполнен, когда вы введете ls, в зависимости от настройки вашей переменной PATH. Это показывает, почему понимание приоритета переменной PATH является важным в среде разработки.

Создание пользовательской команды

Ваш руководитель команды предлагает создать простую пользовательскую команду, чтобы продемонстрировать, как which взаимодействует с переменной PATH. Давайте создадим скрипт с именем hello в вашем домашнем каталоге:

echo '#!/bin/bash
echo "Hello from TechCorp!"' > ~/hello
chmod +x ~/hello

Эта команда создает новый файл с именем hello в вашем домашнем каталоге (~ - это сокращение для домашнего каталога) и делает его исполняемым. При запуске этот скрипт просто выводит "Hello from TechCorp!".

Теперь попробуйте запустить его:

hello

Вы получите ошибку "command not found", потому что ваш домашний каталог не находится в переменной PATH. Переменная PATH представляет собой список каталогов, в которых оболочка ищет исполняемые файлы.

Давайте временно добавим ваш домашний каталог в переменную PATH:

export PATH=$PATH:$HOME

Эта команда добавляет ваш домашний каталог в конец переменной PATH. Команда export делает модифицированную переменную PATH доступной для любых дочерних процессов.

Теперь вы можете запустить hello, и which его найдет:

hello
which hello

Вы должны увидеть "Hello from TechCorp!" и путь к вашему скрипту. Это демонстрирует, как which находит исполняемые файлы в любом каталоге, перечисленном в вашей переменной PATH.

Итоги

В этом практическом занятии вы узнали, как использовать команду which для поиска исполняемых файлов в переменной PATH вашей системы. Вы научились:

  1. Определять местоположение установленных программ
  2. Обрабатывать несуществующие команды
  3. Найти несколько установок одной и той же команды
  4. Понимать приоритет переменной PATH
  5. Создавать и находить пользовательские команды

Вы также познакомились с новыми концепциями, такими как команда echo и перенаправление вывода с помощью >.

Дополнительные опции команды which, не рассмотренные в этом практическом занятии, включают:

  • -i: Игнорировать регистр как в имени команды, так и при поиске в PATH
  • -p: Использовать путь по умолчанию вместо текущего
  • -v: Режим подробного вывода, выводит сообщение об ошибке, если команда не найдена

Эти навыки будут неоценимы, когда вы продолжите свой путь как разработчик в TechCorp и в будущем.