Возврат значений
Тема дорожной карты · Bash
Функции Bash не возвращают произвольные значения так, как функции в большинстве языков программирования: вместо этого функция сообщает об успехе или неудаче через числовой код завершения в диапазоне 0–255, устанавливаемый встроенной командой return, где 0 означает успех, а любое ненулевое значение — сбой. Для передачи строки или сложного результата из функции стандартный шаблон Bash-скриптов — вывести значение внутри функции через echo и захватить его с помощью подстановки команды: result=$(my_function). Альтернативный подход использует переменную-ссылку, объявленную через declare -n ref, или глобальную переменную, которую заполняет функция, — это позволяет избежать накладных расходов на создание дочернего процесса при подстановке команды и является распространённой практикой для производительных скриптов автоматизации Linux. Вызывающий код проверяет код завершения через $? сразу после вызова функции, до того как любая другая команда его перезапишет. Понимание возвращаемых значений и распространения кода завершения необходимо для написания корректных и компонуемых функций Bash в профессиональных shell-скриптах.
Как это работает
Возврат значений: function_name() { commands; } определяет функцию. Аргументы — $1, $2, …, $@. Возвращаемые значения — через exit-код (return N); для реальных данных echo в stdout + захват через $(func). Локальные переменные: local var=value. Функции не first-class — нельзя передавать, нет closures (shell не язык программирования в этом смысле).
Когда применять
Выносите функцию, когда (а) блок повторяется, (б) у него есть осмысленное имя. local для всех внутренних переменных функции (иначе утекают в caller). Echo данных + захват лучше установки глобальных vars + чтения. Не используйте функции для "скорости" — bash-вызовы функций дороги vs C; для горячих циклов перепишите на настоящем языке.
Типичные ошибки
Ловушки Возврат значений: забыли local и случайно модифицируют caller's $i (переменная цикла утекает); return "string" (return принимает только exit-код 0-255); функция зависит от cwd / глобального state без явного input (тяжело тестировать).