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
В 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