Учитывая основную функцию и функцию очистки, как (канонически) я могу вернуть состояние выхода в Bash/Linux?

Контекст:

У меня есть скрипт bash (на самом деле это оболочка для других скриптов), который выполняет следующий псевдокод:

do a main function
if the main function returns:
    $returncode = $? #most recent return code
if the main function runs longer than a timeout:
    kill the main function
    $returncode = 140 #the semi-canonical "exceeded allowed wall clock time" status

run a cleanup function
if the cleanup function returns an error: #nonzero return code
    exit $? #exit the program with the status returned from the cleanup function
else #cleanup was successful
    ....

Вопрос:

Что должно произойти после последней строки?

Если функция очистки прошла успешно, но основной функции нет, должна ли моя программа вернуть 0 (для успешной очистки), или $returncode, который содержит (возможно, ненулевой и неудачный) код возврата основной функции?

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

Тем не менее, это скорее общий / канонический вопрос (и если это неправильное место, убейте его огнем): в программировании на Bash (или Linux в целом) вы обычно хотите вернуть статус, который "означает" что-то (то есть $returncode) или вы игнорируете такие субъективности и просто возвращаете код самой последней функции?

Это не относится к Bash: если у меня есть какой-либо отдельный исполняемый файл, как он может вести себя в этих случаях? Очевидно, что это несколько спорно. Даже если есть система для этих вещей, я уверен, что многие люди игнорируют ее. Все таки хотелось бы знать.

Ура!

1 ответ

Решение

Вернуть код выхода из основного. Как пользователь вашего скрипта, я хочу знать, выполнил ли он свою работу, а не очистился ли он после сбоя. На самом деле, я ожидаю, что программы / скрипты будут корректно очищаться при сбое, поэтому возвращение 0 будет вводить в заблуждение.

Сценарии, написанные лениво, просто возвращаются с тем кодом завершения, который был у их последней команды. Хорошо написанные не забудьте вернуть значимый код выхода.


Кстати, мой любимый способ обеспечить правильную очистку - запустить функцию очистки на trap EXIT,

WORKING_DIR=$(mktemp -d)

cleanUp() {
    rm -rf "$WORKING_DIR"
}

# Run cleanUp() when the script exits, whether that's from a SIGTERM/SIGINT or
# just exiting normally.
trap cleanUp EXIT
Другие вопросы по тегам