Это зависит от окружающей среды, но я бы сказал, что это плохой стиль.
В Unix-подобных системах существует строгое соглашение, что состояние выхода 0 означает успех, а любое ненулевое состояние выхода означает сбой. Некоторые, но не все, программы различают различные виды сбоев с разными ненулевыми кодами выхода; например, grep
обычно возвращает 0, если шаблон был найден, 1, если его не было, и 2 (или более), если произошла ошибка, например, отсутствующий файл.
Это соглашение в значительной степени встроено в оболочку Unix. Например, в sh
, bash
и других подобных Борну оболочках, if
оператор обрабатывает состояние выхода 0 как успех / истина, а ненулевой статус выхода - сбой / ложь:
if your-command
then
echo ok
else
echo FAILURE
fi
Я считаю, что соглашения под MS Windows похожи.
Теперь, конечно, ничто не мешает вам написать свою собственную программу, использующую нетрадиционные коды выхода, особенно если с ней больше ничего не будет взаимодействовать, но имейте в виду, что вы нарушаете хорошо установленное соглашение, и оно может вернуться и укусить вас позже ,
Обычный способ для программы вернуть такую информацию - распечатать ее по адресу stdout
:
status = $(your-command)
echo Result is $status
set -e
куда-нибудь.grep
,diff
возвращает 1 при обнаружении различий; и> 1, если произошла ошибка.Зависит от того, что ожидает ваша среда.
Мой любимый по странности, из Википедии :
источник
Я думаю, что есть прецедент, если код завершения возвращает значащую, релевантную информацию вызывающей стороне, и определение успеха на самом деле не является двоичным. Прецедент, о котором я думаю, - это робокопия, которая возвращает множество разных вещей в зависимости от того, что произошло .
Я добавлю, что у нас всегда возникает какая-то отладка из-за этого - большинство утилит предполагают, что код выхода 0 == success, поэтому волнуюсь, когда robocopy возвращает 1, потому что он скопировал материал не ноль, потому что он не копировал, но не копировал Также нет ошибки.
источник
не возвращать 0 для успешного запуска - плохая идея, потому что это может вызвать путаницу у тех, кто работает с вашей программой. Что если кто-то запустил вашу программу более 100 раз с разными входными данными и захотел узнать, сколько из них завершилось неудачно или завершено успешно, наличие единственного значения успеха значительно упрощает поиск различий, чем наличие множества различных значений.
Если у вас есть программа с несколькими успешными путями возврата, которые могут обозначать разные вещи, я бы сказал, что это признак того, что ваша программа плохо спроектирована.
источник
Я знаю случай, который я считаю приемлемым. Мне известна структура тестирования, которая завершается с общим количеством неудачных тестов. Так, например, если тестовый исполнитель завершается без неудачных тестов, он завершается с нулем. Если один тест не пройден, даже если сам тестовый исполнитель выполнялся с перебоями, он завершается с одним 1. Если два не пройдены, он возвращает 2 и т. Д. Это до 250, что означает «250 или более неудачных тестов».
Он использует коды выхода> 250 для обозначения аварийных выходов.
Хотя это нарушает соглашение, на практике это хорошо работает.
источник
Это действительно зависит от того, что вы пытаетесь передать с помощью кода. Например, DB2 возвращает 100, если данные не найдены, различные другие положительные значения для предупреждений и отрицательные значения для ошибок. Oracle делает нечто подобное.
Поэтому, если существуют разные состояния успеха, возможно, стоит использовать различные возвращаемые значения.
источник
Хороший пример: man sa-update (spamassassin)
КОДЫ ВЫХОДА
В этом случае выход 1 является просто информативным кодом. Однако, если бы я написал код, я бы не выбрал 1, так как обычно это сбой в сети.
источник