Команда 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 первым.

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

export PATH=$HOME/custom_bin:$PATH

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

which prioritydemo

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

/home/labex/custom_bin/prioritydemo

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

which -a prioritydemo

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

/home/labex/custom_bin/prioritydemo
/usr/local/bin/prioritydemo

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

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

Ваш руководитель предлагает создать простую пользовательскую команду, чтобы показать, как 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 и за ее пределами.