TGViewer
BashTex | Linux BashTex | Linux @bash_tex · 2.52K subscribers
Post #625 488
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
  • 👍 5
More from @bash_tex
  1. Oct 6, 2026Ephemeral ports - почему заканчиваются исходящие TCP-порты Когда приложение устанавливает…
  2. Oct 5, 2026name_to_handle_at() - как получить файловый объект без обычного пути В Linux обычно обраща…
  3. Oct 2, 2026madvise() - как процесс подсказывает ядру, как он собирается использовать память Когда про…
  4. Oct 1, 2026flock vs fcntl - почему две блокировки одного файла могут вести себя совершенно по-разному…
  5. Sep 30, 2026DEBUG trap - как Bash выполняет код перед каждой командой В Bash есть специальный DEBUG tr…
  6. Sep 29, 2026tee + process substitution: один поток и несколько получателей Иногда нужно одновременно:…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →