Приложение C. Коды завершения, имеющие предопределенный смысл

Таблица C-1. "Зарезервированные" коды завершения

Код завершенияСмыслПримерПримечание
1разнообразные ошибкиlet "var1 = 1/0"различные ошибки, такие как "деление на ноль" и пр.
2согласно документации к Bash -- неверное использование встроенных командВстречаются довольно редко, обычно код завершения возвращается равным 1
126вызываемая команда не может быть выполненавозникает из-за проблем с правами доступа или когда вызван на исполнение неисполняемый файл
127"команда не найдена"Проблема связана либо с переменной окружения $PATH, либо с неверным написанием имени команды
128неверный аргумент команды exitexit 3.14159команда exit может принимать только целочисленные значения, в диапазоне 0 - 255
128+nфатальная ошибка по сигналу "n"kill -9 $PPID сценария$? вернет 137 (128 + 9)
130завершение по Control-CControl-C -- это выход по сигналу 2, (130 = 128 + 2, см. выше)
255*код завершения вне допустимого диапазонаexit -1exit может принимать только целочисленные значения, в диапазоне 0 - 255

Согласно этой таблице, коды завершения 1 - 2, 126 - 165 и 255[ 67 ] имеют предопределенное значение, поэтому вам следует избегать употребления этих кодов для своих нужд. Завершение сценария с кодом возврата exit 127, может привести в замешательство при поиске ошибок в сценарии (действительно ли он означает ошибку "команда не найдена"? Или это предусмотренный программистом код завершения?). В большинстве случаев, программисты вставляют exit 1, в качестве реакции на ошибку. Так как код завершения 1 подразумевает целый "букет" ошибок, то в данном случае трудно говорить о какой либо двусмысленности, хотя и об информативности -- тоже.

Не раз предпринимались попытки систематизировать коды завершения (см. /usr/include/sysexits.h), но эта систематизация предназначена для программистов, пишущих на языках C и C++. Автор документа предлагает ограничить коды завершения, определяемые пользователем, диапазоном 64 - 113 (и, само собой разумеется -- 0, для обозначения успешного завершения), в соответствии со стандартом C/C++. Это сделало бы поиск ошибок более простым.

Все сценарии, прилагаемые к данному документу, приведены в соответствие с этим стандартом, за исключением случаев, когда существуют отменяющие обстоятельства, например в Пример 9-2.

Обращение к переменной $?, из командной строки, после завершения работы сценария, дает результат, в соответствии с таблицей, приведенной выше, но только для Bash или sh. Под управлением csh или tcsh значения могут в некоторых случаях отличаться.



Примечания:



6

Эта особенность позволяет использовать различные хитрости.

#!/bin/rm

# Самоуничтожающийся сценарий.


# Этот скрипт ничего не делает -- только уничтожает себя.


WHATEVER=65


echo "Эта строка никогда не будет напечатана."


exit $WHATEVER # Не имеет смысла, поскольку работа сценария завершается не здесь.


Попробуйте запустить файл README с сигнатурой #!/bin/more (предварительно не забудьте сделать его исполняемым).



67

Указание кода завершения за пределами установленного диапазона, приводит к возврату ошибочных кодов. Например, exit 3809 в







 


Главная | В избранное | Наш E-MAIL | Добавить материал | Нашёл ошибку | Другие сайты | Наверх