Как коды выхода Linux помогают писать надежные скрипты

Как коды выхода Linux помогают писать надежные скрипты

Резюме

  • Каждая команда Linux возвращает код завершения, где 0 указывает на успешное выполнение, а ненулевые значения указывают на неудачу.
  • Вы можете использовать переменную $? для доступа к коду выхода и управления ходом выполнения программы в скриптах.
  • Будьте осторожны с нестандартными кодами завершения, которые различаются в зависимости от команды, например, diff и curl.

Каждая команда Linux выводит сообщения об ошибках, если она не выполняется, но на эту информацию трудно положиться. Ваши скрипты должны использовать коды выхода, чтобы быть максимально надежными.

Что такое коды выхода?

При запуске команды Linux может произойти сбой. Что-то может пойти не так по разным причинам, но обычно вы увидите сообщение, объясняющее причину:

Как коды выхода Linux помогают писать надежные скрипты

Сообщение об ошибке, которое вы видите, появляется в STDERR, другом потоке от STDOUT, что позволяет вам изолировать ошибки от ожидаемого вывода. Для пользователя описание ошибки должно быть информативным, но скрипты и другие автоматизированные процессы должны знать об ошибках более надежно.

Как коды выхода Linux помогают писать надежные скрипты

Наряду с читаемыми сообщениями об ошибках каждая команда также возвращает код выхода. Это число от 0 до 255, которое указывает, была ли команда выполнена неудачно или успешно. По умолчанию код выхода скрыт, но ваша оболочка предоставляет доступ к этому значению в специальной переменной $?

Как коды выхода Linux помогают писать надежные скрипты

Обратите внимание, что значение 0 указывает на успех, а ненулевое значение означает неудачу. Вы можете проверить это значение в командной строке, запросить его в скрипте и использовать его для управления потоком ваших программ.

Как использовать коды выхода?

В приведенном выше примере ls вернул код выхода 0 при успешном завершении и 1, когда его аргумент не был допустимым файлом. Это может показаться нелогичным и противоречит типичным языкам программирования, которые рассматривают 0 как ложное значение, а 1 как истинное. Однако эта настройка допускает единое универсальное значение успеха и широкий диапазон значений для представления различных типов ошибок.

Помимо вывода переменной $? для ручной проверки статуса выхода, вы можете использовать ее с условным оператором if. Если команда возвращает статус выхода 0, оператор выполнит связанный блок then. В противном случае, если он есть, он выполнит блок else. Например:

если команда; тогда echo «команда выполнена успешно»; иначе echo «команда не выполнена»; fi

Эту конструкцию можно использовать в скрипте оболочки, где ее немного проще отформатировать для удобства чтения:

если команда
    затем echo «команда выполнена успешно»
    else echo «команда не выполнена»
fi

Это эквивалент:

команду

если [ $? -eq 0 ]
    затем echo «команда выполнена успешно»
    else echo «команда не выполнена»
fi

Более длинная версия использует синтаксис квадратных скобок для проверки значения $?, но обычно проще проверить значение напрямую, как в первом случае. Помните, что $? всегда представляет собой код выхода из последней команды, поэтому будьте осторожны. У вас может возникнуть соблазн вывести значение $? для отладки, например

команду

echo «команда вернула код завершения:» $?

если [ $? -eq 0 ]
    затем echo «команда выполнена успешно»
    else echo «команда не выполнена»
fi

Но в момент проверки условия $? будет иметь значение статуса выхода echo, которое почти гарантированно равно 0. Чтобы избежать этого, либо проверяйте команду непосредственно в условии, либо сохраняйте значение $? в переменной.

Как коды выхода Linux помогают писать надежные скрипты

Что еще нужно знать о статусе выхода?

Коды выхода довольно просты, следуя принципу Unix, и это часть их мощи. Но есть некоторые подводные камни и исключительные случаи, о которых вам следует знать.

Коды выхода из вашей оболочки

Ваша оболочка будет использовать коды выхода, даже если введенная вами команда не выполняется правильно. Например, zsh и bash используют 127, если команда не найдена, и 126, если команда не является исполняемой:

Как коды выхода Linux помогают писать надежные скрипты

Нетрадиционные коды выхода

Некоторые команды немного нарушают правила статуса выхода; в любом случае, это всего лишь соглашения. Например, diff использует значение 0 для обозначения «нет различий», значение 1 для обозначения «различий» и значение 2 для обозначения ошибки:

Как коды выхода Linux помогают писать надежные скрипты

Это может запутать значение условных предложений, например:

если diff файл1 файл2; тогда
    echo эти файлы одинаковы!
fi

Команда curl также немного неинтуитивна. Вы могли бы ожидать, что curl сообщит об ошибке HTTP, например 404 для несуществующего URL, как о ненулевом коде статуса, но этого не происходит:

Как коды выхода Linux помогают писать надежные скрипты

Вы можете использовать опцию -f (—fail), чтобы заставить curl вести себя по-другому, возвращая код выхода 22 в случае ошибки:

Как коды выхода Linux помогают писать надежные скрипты

Однако следует помнить, что это не гарантирует 100%-ной безопасности, и некоторые ошибки HTTP, включая те, которые требуют аутентификации, по-прежнему будут возвращать код выхода 0.

Использование статуса выхода в цепочке команд

Один из лучших способов быстрого выхода из статуса происходит без необходимости думать об этом. Вот простой пример:

ls program && ./program && echo success || echo epic fail

Логические операторы && и || позволяют вам запускать более одной команды на основе статуса выхода других. Они похожи на соответствующие операторы в большинстве языков программирования, но они соблюдают соглашение о коде выхода. Оператор && запустит команду справа от себя только в том случае, если команда слева вернет статус выхода 0. Оператор || запустит команду справа от себя только в том случае, если команда слева завершится сбоем с ненулевым статусом.

Как коды выхода Linux помогают писать надежные скрипты

Очень распространенный случай возникает, когда вы создаете программное обеспечение с нуля, используя следующий рецепт:

./configure && make && make install

Три части этой команды выполняют следующие действия:

  • ./configure запускает локальный скрипт, который проверяет вашу среду и генерирует Makefile.
  • make запускает программу make и собирает программное обеспечение, используя Makefile.
  • make install копирует сгенерированный исполняемый файл в известное место, например /usr/local/bin.

Если какая-либо часть этого процесса даст сбой, он будет немедленно остановлен без попытки выполнить оставшуюся часть.

Истинные и ложные приказы

Ваша система Linux включает две любопытные команды: true и false. Каждая из них ничего не делает, кроме как возвращает соответствующий код выхода: 0 и 1 соответственно:

Как коды выхода Linux помогают писать надежные скрипты

Они могут показаться не очень полезными, но эти команды пригодятся для тестирования и некоторых задач скриптинга оболочки. Вы можете использовать true в операторе while для создания бесконечного цикла:

в то время как правда
do
    эхо «работает до тех пор, пока ты ^c»
    спать 10
сделанный

Вы также можете использовать их вместе с логическими операторами для изменения поведения команды. Например, вы можете временно остановить выполнение длинной цепочки команд:

false && (ни одна || из этих && команд || не будет выполнена)

Или вы можете принудительно продолжить выполнение цепочки команд, даже если одна из команд завершится ошибкой:

cat файл-который-может-не-существовать | true && echo done

Возврат кода выхода из собственных скриптов

Вы, вероятно, уже использовали команду exit, чтобы выйти из терминала. Технически, она выходит из оболочки, и это означает, что вы можете использовать ее также для остановки скрипта оболочки. По умолчанию ваши скрипты завершатся с тем же кодом, что и последняя команда:

Как коды выхода Linux помогают писать надежные скрипты

Но вы можете изменить код выхода, передав числовой параметр команде выхода:

номер выхода

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

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

Валентин Павлов/ автор статьи
Страсть Влентина к играм началась с Resident Evil, и с тех пор он не переставал играть в хоррор-игры. Пишет экспертные руководства для самых сложных игр и обзоры для самых громких релизов. Является магистром журналистики и имеет степень бакалавра лингвистики. Любимые игры: GTA 5, Silent Hill 2, Call of Duty: Modern Warfare 2, Heavy Rain, Metro 2033 и другие.
Понравилась статья? Поделиться с друзьями:
Добавить комментарий