Помнишь, я писал про 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
Роман Шубин
Роман Шубин
CEO & CTO, Главред в «Цифровой улей»
Задать вопрос
Включает режим noexec (режим «нет выполнения»). Когда этот режим включён, скрипт не будет выполняться, а только проверяться на синтаксические ошибки. В общем, много вариантов есть, чтобы проверить не запуская.

А завтра, кстати, внеплановая пятница! Ждём-ждём…