Что возвращает функция в Bash
Что проверяют
Понимаете ли вы, что функция в shell это не функция из обычного языка, а команда. У команды есть код завершения и потоки вывода, и «возврат значения» здесь раскладывается именно на это. Ответ показывает, писали ли вы скрипты сложнее десяти строк.
Как отвечать
return задаёт код завершения: 0 это успех, любое ненулевое значение ошибка. Число усекается до диапазона от 0 до 255, поэтому return 256 превратится в 0. Если return не написан, функция вернёт код последней выполненной команды. Читают его через $? либо прямо условием.
Данные возвращают через стандартный вывод и подстановку команд:
get_version() {
printf '%s' "1.2.3"
}
version="$(get_version)"
if ! check_config; then
echo "конфиг невалиден" >&2
exit 1
fiТретий способ, без подоболочки: записать результат в переменную с заранее известным именем или в ту, чьё имя передано аргументом. Это дешевле подстановки команд и удобно, когда функция вызывается в цикле.
Хорошо добавить про set -euo pipefail и про то, что в конвейере $? содержит код последней команды, а коды всех звеньев лежат в массиве PIPESTATUS.
Где спотыкаются
Пишут return "текст" и ждут строку. Интерпретатор ругается на нечисловой аргумент, а вызывающий получает ненулевой код и считает, что функция упала.
Второе: объявляют и присваивают одной строкой: local out=$(cmd). Код завершения такой строки принадлежит local, а не команде, и всегда нулевой. Объявление и присваивание нужно разделять.
Третье: смешивают логи и результат в одном потоке. Любой echo для человека попадает в подстановку команд и портит значение. Диагностику пишут в stderr, в stdout уходит только результат.