Коды завершения, также известные как коды возврата или статусы завершения, — это числовые сигналы, которые программа, команда или скрипт отправляют операционной системе (или вызывающему процессу) по завершении работы. Вам не нужно просматривать потенциально длинные файлы журналов, чтобы диагностировать сбой — код завершения часто даёт быстрое представление о характере проблемы.
Общепринятое соглашение гласит, что при успешном выполнении программы она возвращает код завершения 0
. Любое другое число, обычно в стандартном диапазоне от 1 до 255, указывает на то, что что-то пошло не так.
Самый простой способ проверить код завершения последней выполненной команды в Unix-подобных оболочках (таких как Bash или Zsh) — проверить специальную переменную оболочки $?
. Например, сначала выполните любую команду, а затем проверьте её код завершения:
ls /nonexistent_directory echo $?
Команда echo $?
выводит числовой код завершения, сохранённый в переменной $?
. Если вы видите 0, это означает, что предыдущая команда выполнена успешно. Неравное нулю значение, например 1, 2 или 127, указывает на ошибку, а конкретное число даёт представление о типе проблемы — возможно, отсутствует файл, каталог или разрешения.
Коды завершения особенно полезны при написании сценариев оболочки. Они помогают сценарию определить, всё ли прошло успешно, и решить, что делать дальше.
Вот простой пример, который копирует файл в папку с резервными копиями и сообщает, успешно ли выполнено копирование:
#!/bin/bash # Попробуйте скопировать файл cp important_file.txt backup/ # Проверьте, успешно ли выполнено копирование, используя код завершения ($? содержит код завершения из последней команды). if [ $? -eq 0 ]; then echo "Резервное копирование выполнено успешно!" else echo "Ошибка резервного копирования с кодом завершения $?" exit 1 # Завершите работу скрипта с кодом ошибки, указывающим на то, что что-то пошло не так. fi
Когда команда cp выполняется, она возвращает код завершения. Код завершения 0 означает, что всё прошло успешно. Если код не равен 0, что-то пошло не так, и скрипт выводит сообщение об ошибке и завершает работу с кодом 1.
Помимо проверки кодов завершения команд, вы можете определить собственные коды завершения для обозначения различных типов ошибок. Это сделает ваши скрипты более информативными и позволит пользователям понять, какая именно проблема возникла.
Рассмотрим этот сценарий:
#!/bin/bash # Убедитесь, что указан аргумент (имя файла). if [ -z "$1" ]; then echo "Использование: $0 <filename>" exit 1 # Код завершения 1 указывает на то, что аргумент не был указан. fi # Проверьте, существует ли файл, указанный в качестве первого аргумента. if [ ! -f "$1" ]; then echo "Ошибка: Файл не найден" exit 2 # Пользовательский код завершения 2 указывает на то, что файл не был найден. fi
Если кто-то запустит ваш скрипт и он выйдет из строя, можно обратиться к коду завершения, чтобы определить точную ошибку. В этом примере код завершения 1
означает, что пользователь не указал обязательный аргумент, а код завершения 2 явно указывает на то, что файл не был найден. Такой структурированный подход особенно полезен, когда ваш скрипт является частью более крупной системы или когда другой скрипт зависит от его результатов.
Хотя разные программы могут определять собственные коды завершения, во многих инструментах командной строки, особенно в Linux и Unix-подобных системах, вы увидите некоторые общие закономерности. Вот некоторые из наиболее часто встречающихся:
У некоторых конкретных программ есть свои уникальные коды завершения. Например, grep возвращает 0, если находит совпадения, 1, если не находит совпадений, и 2, если возникает ошибка. Кроме того, разработчики могут использовать практически любое число (обычно от 0 до 255 в Unix-подобных системах).
Bash также предоставляет два удобных оператора &&
и ||
, которые позволяют объединять команды в зависимости от того, завершилась предыдущая команда успешно или нет:
Например, предположим, что вы хотите создать каталог, а затем сразу же перейти в него. Если создание каталога не удаётся или переход в него не работает, вы можете вывести сообщение об ошибке:
mkdir new_directory && cd new_directory || echo "Не удалось создать каталог и получить к нему доступ"
Здесь mkdir new_directory
пытается создать папку. Если это удаётся, код немедленно запускается cd new_directory
. Если какой-либо из этапов не выполняется, оператор ||
срабатывает и выводит сообщение об ошибке.
Коды завершения могут показаться незначительной деталью, но они являются частью того, что делает инструменты командной строки такими мощными. Они создают общий язык для общения программ об успехах и неудачах, что важно для создания сложных систем.
Если вы только начинаете работать с командной строкой, начните с того, что возьмите за правило проверять, echo $?
когда команды ведут себя не так, как ожидалось. Вскоре вы начнёте использовать коды завершения в своих скриптах и оцените эту простую, но эффективную систему коммуникации.