Значення виходу 0, виходу 1 та виходу 2 у сценарії bash


49

Я роблю кілька вправ на практиці.

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

Я прийняв рішення:

#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. Інші значення вказують на помилку. Дивіться, наприклад, Вихідні коди з особливими значеннями
В. Олсен

2
Баш сценарій - це як кінотеатр, існують різні. Виписки виходу позначають розташування виходів для інтерпретатора 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() {}

Caveat: Використання правильного коду виходу не є вимогою і не виконує оболонку. Розробники можуть ігнорувати вказівки, якщо вважають це розумним.


8
Але будьте обережні. Що означає вихідний код, повністю залежить від розробників програми.
муру

Крім того, хоча пов'язане джерело, Посібник із розширеного сценарію Bash, стверджує , що він містить " Зарезервовані коди виходу" (наголос в оригіналі), ця заява є і не цитованою, і повністю помилковою .
Ілля Каган

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частини.


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 аргументу на команду exit відповідь у всіх цих випадках до значення echo $?буде рівним нулю.

Однак, вказавши 1 аргумент на команду exit, відповідь на значення echo $?було б 1. Тому використовуйте 1 аргумент для команди exit, коли ви хочете вказати, що сценарій вийшов із умови помилки.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.