return против exit: как не завершить весь скрипт внутри функцииВ Bash функция может вернуть управление вызывающему коду или полностью завершить текущий shell. Эти два случая часто путают.
▪️
exit завершает весь скриптcheck_config() {
if [ ! -f config.conf ]; then
echo "Config not found"
exit 1
fi
}
check_config
echo "Продолжаем работу"Если
config.conf нет, выполнение закончится прямо внутри функции. Строка Продолжаем работу никогда не выполнится.▪️
return завершает только функциюcheck_config() {
if [ ! -f config.conf ]; then
echo "Config not found"
return 1
fi
}
check_config
echo "Продолжаем работу"Теперь функция завершилась с кодом
1, но сам скрипт продолжил выполнение.Именно поэтому
return обычно используют внутри функций, а exit - на уровне самого скрипта.▪️Код возврата можно обработать
if check_config; then
echo "Config OK"
else
echo "Config error"
fi
Или сохранить результат:
check_config
status=$?
if [ "$status" -ne 0 ]; then
echo "Ошибка: $status"
fi
▪️Важный нюанс
return можно использовать только внутри функции или в контексте, где Bash допускает возврат из текущего sourced-файла.Например:
return 1
в обычном запускаемом скрипте верхнего уровня приведёт к ошибке:
return: can only `return' from a function
▪️Типичная ошибка
deploy() {
check_config || exit 1
start_service
}Если
deploy вызывается из другого скрипта как функция, exit завершит уже весь shell.Чаще правильнее:
deploy() {
check_config || return 1
start_service
}А решение о завершении оставить вызывающему коду:
deploy || exit 1
Так функция сообщает об ошибке, а не решает за весь скрипт, что делать дальше.
BashTex 📱 #bash #linux