Помнишь, я писал про shellcheck, который проверяет Bash-скрипты на синтаксические и подобные ошибки. Ну так вот, у интерпретатора Bash есть подобный функционал прям из коробки.
Суть — проверить скрипт на ошибки до запуска.
Перед запуском скрипта добавь флаг -n, и оно тебе скажет, накосячил ты или нет.
Конечно, коробочный вариант не такой гибкий, как shellcheck, но зато ничего не нужно устанавливать лишнего. Это как nginx -t перед его ребутом. Зачем ставить что-то внешнее, если это уже предусмотрено в самой программе. Ну только если расширить функционал и получить больше плюшек.
А если работаешь с гитом, можешь сделать pre-hook, и гавно в репу уже не улетит (но если постараешься, то улетит):
bashErr=$(find src/ -type f -name '*.sh' -exec bash -n {} \; 2>&1 > /dev/null)
if [ -n "$bashErr" ]; then
echo "$bashErr"
exit 1
fi
После запуска этого хука проверяются все *.sh-скрипты в папке src. Пример скрипта с ошибкой:
echo "Hello Bashdays
exit 0
Хуй Хук выдаст тебе сообщение src/script.sh: 7: Syntax error: Unterminated quoted string и запретит (коммитить, пушить в мастер).
Нечто подобное было прикручено к puppet очень давно в одной студии, был какой-то внутренний линтер на хуке гита, но хлебнул я знатно с ним. Мне пушить, а он на какие-то фантомные пробелы орёт, падла. Короче, как только встал у руля, избавился и от этого вонючего паппета, от хуков и от команды.
Ну или как вариант можно включать set -u, например, если переменную не объявил и попытался где-то её использовать.
set -u
echo "Переменная VAR: $VAR"
./script.sh: line 3: VAR: unbound variable
Или так:
set -o noexec
А завтра, кстати, внеплановая пятница! Ждём-ждём…








Комментарии