Вихід з коду в кінці скрипту bash


22

Мене бентежить значення коду виходу в кінці баш-скрипту: я знаю, що код виходу 0 означає, що він закінчився успішно, і що є ще багато номерів вихідних кодів (127, якщо я не помиляюся?)

Моє запитання стосується того, коли ви бачите код виходу 0 в кінці сценарію, чи примушує він код виходу як 0, навіть якщо сценарій не вдався чи він має інше значення?


2
Якщо сценарій закінчується exit 0, він вийде з кодом виходу 0, незалежно від того, що відбувається в сценарії.
Хетчлок

@Hatclock чому ви не опублікували свою відповідь повною обіцяною відповіддю? як коментар я не можу це відзначити, і я не думаю, що ви отримуєте підроблені інтернет-бали за відповідь (правда?) Думаю просто ... (Кудо за швидку відповідь)
Busted

1
Я на залізничному вокзалі на своєму телефоні, мені не дуже подобається надто друкувати на телефоні. Здається, у ilkkachu хороша відповідь!
Хетчлок


2
@Hatclock Ні, зовсім не. Якщо сценарій закінчується exit 0, він вийде з кодом 0, тільки якщо ця остання інструкція була виконана. Єдиний вплив exit 0в кінці сценарію - повернути 0 замість стану з попередньої інструкції.
Жил "ТАК - перестань бути злим"

Відповіді:


22

Вбудована команда exitвиходить з оболонки (з посилання Баша ):

exit [n]
Вийдіть з оболонки, повернувши статус n батьківському оболонці. Якщо n опущено, стан виходу є статус останньої виконаної команди. Будь-яка пастка на EXIT виконується до завершення оболонки.

Запуск до кінця файлу також закінчується, повертаючи код повернення останньої команди, тому так, фінал exit 0зробить вихід сценарію успішним статусом незалежно від стану виходу попередніх команд. (Тобто, якщо припустити, що сценарій досягне фіналу exit.) Наприкінці сценарію ви також можете використати trueабо :отримати вихідний нуль.

Звичайно, частіше ви будете використовувати exitзсередини a, ifщоб закінчити сценарій посередині.

Вони повинні надрукувати 1 ( $?містить код виходу, повернутий попередньою командою):

sh -c "false" ; echo $?
sh -c "false; exit" ; echo $?

Хоча це має надрукувати 0:

sh -c "false; exit 0" ; echo $?

Я не впевнений, чи exitмає сенс сценарій "невдалий" при виконанні має сенс, оскільки цілком можливо, що деякі команди, керовані сценарієм, відмовляються, але сам сценарій досягти успіху. Автор сценарію вирішує, що є успіхом, а що ні.

Також стандартний діапазон для кодів виходу становить 0..255. Коди вище 127 використовуються оболонкою для позначення процесу, закінченого сигналом, але їх можна повернути звичайним способом. waitСистемний виклик фактично повертає більш широке значення, з іншими , що містять битами стану , встановлених в операційній системі.


Класно, я не знав про 8-бітну код виходу. Спасибі!
Будівництво

Зауважте, що коли процес вбито, він не виходить із кодом виходу> 127. У цьому випадку деякі оболонки встановлені $?на 128 + signum. Дивіться код виходу за замовчуванням, коли процес закінчується? для деталей.
Стефан Шазелас

exit 0поверне лише 0, якщо вихід виконаний. (він може вийти іншим маршрутом).
ctrl-alt-delor

18

0 означає успіх, додатні цілі числа означають невдачу. Існує 255 різних кодів помилок, але значення 126 і вище зарезервовані, щоб вказати, що програма не могла запуститися (126 або 127) або була вбита сигналом (129 і вище). Дивіться код виходу за замовчуванням, коли процес закінчується? і Які значення повернення / виходу я можу використовувати у функціях / скриптах bash? для отримання додаткової інформації.

Статус виходу скрипта оболонки - це стан виходу останньої команди, яку виконав сценарій. Так, наприклад

#!/bin/sh
somecommand

повертає статус виходу somecommand, тоді як

#!/bin/sh
somecommand
exit 0

повертає 0 незалежно від того, що somecommandповернуто. Цей другий сценарій також можна було написати

#!/bin/sh
somecommand
true

Якщо exit 0розмістити в кінці сценарію, це не обов'язково призводить до повернення 0. Це повертає 0 лише тоді, коли буде досягнуто кінця сценарію. Наприклад, наступний сценарій завжди повертає 3:

#!/bin/sh
exit 3
exit 0

Наступний скрипт також завжди повертає код помилки, окрім відображення повідомлення про синтаксичну помилку:

#!/bin/sh
}
exit 0

Наступний сценарій повертає 1 або 0 залежно від першого аргументу:

#!/bin/sh
if [ "$1" = "foo" ]; then
  exit 1
fi
exit 0

Наступний скрипт повертає статус somecommand, оскільки set -eвикликає вихід сценарію, якщо він somecommandне працює:

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