Значение выхода 0, выхода 1 и выхода 2 в скрипте bash

49

Я делаю несколько упражнений.

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

Я сделал решение:

#test for number of argument

if [ "$#" -eq 0 ] ; 
then
   echo -e "No argument."
   echo -e "Write a number between 1 and 12."
   exit 1
elif [ "$#" -gt 1 ] ;
then
   echo -e "More than 1 argument."
   echo -e "Write a number between 1 and 12."
   exit 1
else

   numb=$1
   case "$numb" in
      1) echo "Month: January";;
      2) echo "Month: February";;
      3) echo "Month: March";;
      4) echo "Month: April";;
      5) echo "Month: May";;
      6) echo "Month: June";;
      7) echo "Month: July";;
      8) echo "Month: August";;
      9) echo "Month: September";;
     10) echo "Month: October";;
     11) echo "Month: November";;
     12) echo "Month: December";;
      *) echo -e "You wrote a wrong number. Try again with writing number between 1 and 12.";;

   esac
fi
exit 2
exit 0

Что exit 1, exit 0и exit 2значит, и почему мы используем их?

андрей бенедичич
источник
5
Успешно выполненный код должен завершиться с кодом 0. Другие значения указывают на ошибку. См., Например, коды выхода с особыми значениями
V. Olsen
2
Сценарий bash похож на кинотеатр, там есть и другое. Операторы выхода отмечают расположение выходов для интерпретатора bash. Когда скрипт запускается, интерпретатор должен работать до ближайшего выхода.
ДепрессияДаниэль
5
Если это код, который вы написали, почему вы использовали утверждения, которые вы даже не понимаете?
Дмитрий Григорьев
5
1) Вы приняли ответ сразу после публикации вопроса. Дайте ему 24 часа, чтобы дождаться еще лучших ответов. 2) Принятый ответ неверен и вводит в заблуждение. Правильный ответ: «Для кодов выхода нет значения по умолчанию (за пределами 0 = успех); вы, как разработчик сценария, определяете семантику». 3) Если вы создали этот скрипт, почему вы добавили команды выхода (все из которых логически лишние или могут привести к «выходу 1», так как вы все равно используете if-else).
AnoE

Ответы:

58

Вот одна хорошая ссылка для кодов выхода оболочки :

Exit code 0        Success
Exit code 1        General errors, Miscellaneous errors, such as "divide by zero" and other impermissible operations
Exit code 2        Misuse of shell builtins (according to Bash documentation)        Example: empty_function() {}

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

user535733
источник
8
Будьте осторожны, хотя. Что означает код выхода, полностью зависит от разработчиков программы.
Муру,
Кроме того, хотя связанный источник, Advanced Bash Scripting Guide, утверждает, что показывает « Зарезервированные коды выхода» (выделено в оригинале), это утверждение является и не цитируемым, и полностью ложным .
Элия ​​Каган
23

Использование exitи числа - удобный способ сообщить о результатах вашего сценария. Это имитирует способ, которым команды bash выводят код возврата. С командами bash код возврата 0 обычно означает, что все выполнено успешно без ошибок. exitтакже заставляет ваш скрипт остановить выполнение в этой точке и вернуться в командную строку.

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

Вы можете получить код возврата последней команды bash, используя переменную оболочки $?следующим образом:

$ echo "something"
something
$ echo $?
0
$ cp
cp: missing file operand
Try 'cp --help' for more information.
$ echo $?
1

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

exit 2
exit 0

В некотором смысле бессмысленно, так как вы никогда не сможете достичь роли exit 0.

Arronical
источник
3

Само по себе exitподразумевает выходное значение ноль или успешное завершение вашего скрипта. Вам не нужно добавлять нулевой аргумент в команду выхода, чтобы указать успешное завершение. Ваш сценарий может (или, вероятно, будет) завершиться успешно, хотя он проверяет ошибочное состояние. В этом случае вы специально хотите, чтобы он завершился с ошибкой (или 1).

echo -e "Enter numbers 1-4" \c"
read NUM
case $NUM in 
    1) echo "one";;
    2) echo "two";;
    3) echo "three";;
    4) echo "four";;
    *) echo "invalid answer"
       exit 1;;
esac

Команда exitв последней строке не должна быть там вообще. Он может быть вызван с нуля или не вызываться вообще. Без указания аргумента 1 в команде выхода ответ во всех этих случаях echo $?будет нулевым.

Однако, указав аргумент 1 для команды выхода, ответ на запрос echo $?будет равен 1. Поэтому используйте аргумент 1 для команды выхода, если вы хотите указать, что скрипт завершился с ошибкой.

geekasaurus
источник