Архитектура большого bash-скрипта
Пока скрипт на 30 строк - все терпимо. На 300 строк начинается хаос. На 1000 - уже никто не понимает, где init, где логика, где cleanup. Чтобы bash не превратился в лапшу, ему нужна архитектура.
📂 Нормальная структура проекта
project/
├── main.sh
├── lib/
│ ├── log.sh
│ ├── config.sh
│ ├── checks.sh
│ └── deploy.sh
├── conf/
│ └── app.conf
└── tmp/
Где:
main.sh - точка входа
lib/ - функции по темам
conf/ - конфиги
tmp/ - временные файлы
▪️ Деление на модули
Не надо держать все в одном файле.
Лучше так:
source "$(dirname "$0")/lib/log.sh"
source "$(dirname "$0")/lib/checks.sh"
Примеры модулей:
log.sh - логгер
config.sh - загрузка переменных
checks.sh - проверки окружения
actions.sh - основная логика
▪️ Naming: единый стиль
Худший вариант:
doStuff()
x()
RunAll()
Лучше:
log_info()
check_dependencies()
deploy_app()
cleanup_tmp()
Для приватных функций можно префикс:
_internal_parse_config()
▪️ Поток исполнения. В начале файла:
main() {
load_config
check_dependencies
run_tasks
}
main "$@"
Это делает скрипт читаемым как программу, а не как свалку команд.
BashTex 📱 #bash #scripts
Пока скрипт на 30 строк - все терпимо. На 300 строк начинается хаос. На 1000 - уже никто не понимает, где init, где логика, где cleanup. Чтобы bash не превратился в лапшу, ему нужна архитектура.
📂 Нормальная структура проекта
project/
├── main.sh
├── lib/
│ ├── log.sh
│ ├── config.sh
│ ├── checks.sh
│ └── deploy.sh
├── conf/
│ └── app.conf
└── tmp/
Где:
main.sh - точка входа
lib/ - функции по темам
conf/ - конфиги
tmp/ - временные файлы
▪️ Деление на модули
Не надо держать все в одном файле.
Лучше так:
source "$(dirname "$0")/lib/log.sh"
source "$(dirname "$0")/lib/checks.sh"
Примеры модулей:
log.sh - логгер
config.sh - загрузка переменных
checks.sh - проверки окружения
actions.sh - основная логика
▪️ Naming: единый стиль
Худший вариант:
doStuff()
x()
RunAll()
Лучше:
log_info()
check_dependencies()
deploy_app()
cleanup_tmp()
Для приватных функций можно префикс:
_internal_parse_config()
▪️ Поток исполнения. В начале файла:
main() {
load_config
check_dependencies
run_tasks
}
main "$@"
Это делает скрипт читаемым как программу, а не как свалку команд.
BashTex 📱 #bash #scripts