Проектная лаборатория

Собственный Shell

0 / 76этапов пройдено

Этап 07 · Основные этапы

Поиск исполняемых файлов

Русский перевод заданий CodeCrafters. Примеры подготовлены для Go. Выбор языка меняет команды и результаты, но не текст задания.

На этом этапе вы расширите встроенную команду type для поиска исполняемых файлов с помощью PATH.

Переменная окружения PATH

Переменная окружения PATH задаёт список каталогов, в которых оболочка должна искать исполняемые программы.

Например, если PATH имеет значение /dir1:/dir2:/dir3, оболочка ищет исполняемые файлы сначала в /dir1, затем в /dir2 и наконец в /dir3, именно в таком порядке.

Поиск исполняемых файлов

Когда type получает имя команды, оболочка должна выполнить следующие шаги:

  1. Проверить, является ли команда встроенной (например, exit или echo). Если да, сообщить об этом (<command> is a shell builtin) и остановиться.
  2. Если команда не встроенная, пройти по всем каталогам в PATH. Для каждого каталога:
    1. Проверить, существует ли файл с именем команды.
    2. Проверить, имеет ли файл разрешение на выполнение.
    3. Если файл существует и имеет разрешение на выполнение, вывести <command> is <full_path> и остановиться.
    4. Если файл существует, но не имеет разрешения на выполнение, пропустить его и перейти к следующему каталогу.
  3. Если исполняемый файл не найден ни в одном каталоге, вывести <command>: not found.

Например:

$ type grep
grep is /usr/bin/grep
$ type invalid_command
invalid_command: not found
$ type echo
echo is a shell builtin

Проверки

Тестирующая система запустит вашу программу с собственным PATH следующим образом:

PATH="/usr/bin:/usr/local/bin:$PATH" ./your_program.sh

Затем система отправит оболочке последовательность команд type:

$ type ls
ls is /usr/bin/ls
$ type valid_command
valid_command is /usr/local/bin/valid_command
$ type invalid_command
invalid_command: not found
$

Тестирующая система проверит, что команда type правильно определяет исполняемые файлы в PATH:

  • Исполняемые файлы из PATH отображаются с полным путём (<command> is <full_path>).
  • Файлы без разрешения на выполнение пропускаются.
  • Для несуществующих команд выводится сообщение <command>: not found.

Примечания

  • Можно использовать exec.LookPath или самостоятельно реализовать обход PATH.

  • PATH может включать каталоги, отсутствующие на диске, поэтому ваш код должен корректно обрабатывать такие случаи.

  • При разборе переменной окружения PATH помните, что разделитель (обычно : или ;) может зависеть от операционной системы. Чтобы правильно разделить каталоги, используйте независимые от ОС средства работы с путями вашего языка (например, os.pathsep в Python, File.pathSeparator в Java или path.delimiter в Node.js).

Проверка в вашей IDE

Нужны Node.js, Git, Go 1.24+ для тестеров и инструменты выбранного языка. Тестеры загружаются и запускаются локально; отдельным проектам нужны дополнительные системные зависимости.

Настройка проекта и IDE

1. Создайте проект один раз

node '/opt/graphlms/tools/project-lab/cli.mjs' init shell ./my-shell --language go

2. Откройте папку в IDE

cd ./my-shell

Реализуйте требования этапа в созданном проекте.

Запустите из папки проекта

node '/opt/graphlms/tools/project-lab/cli.mjs' submit --stage mg5

Запускайте submit из папки проекта. Это локальные проверки, а не сертификаты или результаты аккаунта CodeCrafters.

Результат проверки

go / ЛОКАЛЬНО

Подключение к локальной проверке…

Здесь появится результат

Запустите submit в терминале. Страница обновляет результаты каждые 8 секунд.

GraphLMS — инженерная лаборатория роста