readonly и local
Тема дорожной карты · Bash
Встроенные команды readonly и local — два ключевых инструмента для управления областью видимости переменных и неизменяемостью в Bash-скриптах. Команда readonly var=value помечает переменную как неизменяемую, что делает её идеальной для объявления констант и значений конфигурации. Любая попытка перезаписать такую переменную приведет к фатальной ошибке, что обеспечивает надежность конфигурации в скриптах автоматизации Linux. Встроенная команда local ограничивает область видимости переменной охватывающей функцией и её дочерними функциями, что предотвращает случайное загрязнение глобального пространства имён. Это критически важная практика для написания shell-скриптов, особенно в нетривиальных Bash-программах. Сочетание обоих подходов — local -r var=value или эквивалентно local var=value; readonly var — создаёт константу в области видимости функции, которую не может перезаписать внутренняя логика. Последовательное использование local в функциях Bash и readonly для констант верхнего уровня улучшает безопасность скриптов, их тестируемость и дисциплину в профессиональном написании Linux shell-скриптов.
Как это работает
Команды readonly и local используются для управления переменными в Bash. Формат объявления переменной выглядит так: name="value" (без пробелов вокруг =). Переменная может быть использована как $name или ${name} (форма с фигурными скобками позволяет добавлять суффикс, например ${name}_suffix). Локальные переменные объявляются внутри функций с помощью команды local x. Для объявления переменной как неизменяемой используется команда readonly. Экспортируемые переменные (которые будут доступны в подпроцессах) объявляются с помощью команды export NAME=value. Существуют и специальные переменные, такие как $0 (имя скрипта), $1-$9 (позиционные аргументы), $# (количество аргументов), $@ (все аргументы как отдельные слова), $* (все аргументы как одно), $? (последний exit-код), $$ (PID), $! (последний bg PID).
Когда применять
Всегда следует заключать раскрытие переменных в кавычки ("$x", а не $x) — незакавыченные переменные подвержены word-splitting по пробелам и glob-расширяются, что может привести к ошибкам, особенно при работе с именами файлов, содержащими пробелы. Формат ${var:-default} используется для установки дефолтного значения, ${var:?error} требует наличия значения переменной, а ${var:+alt} возвращает "alt", только если переменная var была задана. Команда local должна использоваться внутри функций для предотвращения загрязнения родительского пространства имён. Переменные окружения следует объявлять в ЗАГЛАВНЫХ, а локальные переменные — в нижнем регистре.
Типичные ошибки
Основные ловушки при использовании команд readonly и local включают в себя следующие: name = "value" с пробелами (что парсится как команда); использование ЗАГЛАВНЫХ для всех переменных (что может вызвать коллизии с переменными окружения); отсутствие использования local (что приводит к утечке переменных в родительский контекст); использование echo $foo вместо echo "$foo" (что приводит к word-splitting и ошибкам).