Введение
В этой лабораторной работе вы научитесь использовать команду 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.
Чтобы сделать это поведение более явным, мы можем использовать простой скрипт оболочки. Здесь мы введем две новые концепции:
- Скрипт оболочки — это текстовый файл, который хранит команды и выполняет их по порядку.
- Шаблон
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 вашей системы. Вы узнали, как:
- Находить расположение установленных программ.
- Обрабатывать отсутствующие команды.
- Обнаруживать несколько установленных версий одной и той же команды.
- Понимать приоритет PATH.
- Создавать и находить пользовательские команды.
Вы также попрактиковались в написании простых скриптов оболочки, делая файлы исполняемыми с помощью chmod +x и настраивая PATH для управления тем, какая команда будет запущена.
Эти навыки будут неоценимы в вашей дальнейшей карьере разработчика в TechCorp и за ее пределами.



