Команда Linux which: Поиск исполняемых файлов

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

Введение

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

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

Основы работы с '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. Скрипт оболочки — это текстовый файл, содержащий последовательность команд, которые выполняются по порядку.
  2. Шаблон cat <<'EOF' ... EOF позволяет записывать несколько строк в файл, не заботясь об управлении вложенными кавычками.

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

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

Эта команда создает файл ~/check_techbuild.sh и наполняет его небольшим Bash-скриптом.

Вот что означают важные строки:

  • #!/bin/bash указывает Linux запускать скрипт с помощью Bash.
  • which techbuild проверяет, можно ли найти команду в вашем PATH.
  • >/dev/null 2>&1 скрывает стандартный вывод и вывод ошибок, чтобы скрипт мог вывести свой собственный понятный результат.

Теперь дайте файлу права на выполнение и запустите его:

chmod +x ~/check_techbuild.sh

Команда chmod +x добавляет право на выполнение, что позволяет Linux запускать файл как команду.

~/check_techbuild.sh

Этот скрипт выведет techbuild is not installed, так как which не смог найти эту команду.

Обнаружение нескольких установленных версий

Продолжая настройку окружения, вы понимаете, что в 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 первым.

В рамках лабораторной работы в ~/custom_bin уже создана пользовательская команда ls. Добавьте этот каталог в начало вашего PATH, чтобы он проверялся перед системными каталогами:

export PATH=$HOME/custom_bin:$PATH

Теперь проверьте, какая команда ls будет запускаться по умолчанию:

which ls

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

/home/labex/custom_bin/ls

Чтобы увидеть все соответствующие команды ls в вашем PATH, выполните:

which -a ls

Вы должны увидеть сначала вашу пользовательскую команду, а затем системные версии:

/home/labex/custom_bin/ls
/usr/bin/ls
/bin/ls

Это наглядно демонстрирует приоритет PATH: which ls возвращает первый найденный исполняемый файл, в то время как which -a ls показывает полный список результатов поиска.

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

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

cat > ~/hello <<'EOF'
#!/bin/bash
echo "Hello from TechCorp!"
EOF
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. Создавать и находить пользовательские команды.

Вы также попрактиковались в написании простых скриптов оболочки, делали файлы исполняемыми с помощью chmod +x и настраивали PATH для управления тем, какая команда будет запущена.

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