Чтобы быть в безопасности, я бы хотел, чтобы bash прервал выполнение скрипта, если он обнаружит синтаксическую ошибку.
К моему удивлению, я не могу этого достичь. ( set -e
недостаточно). Пример:
#!/bin/bash
# Do exit on any error:
set -e
readonly a=(1 2)
# A syntax error is here:
if (( "${a[#]}" == 2 )); then
echo ok
else
echo not ok
fi
echo status $?
echo 'Bad: has not aborted execution on syntax error!'
Результат (bash-3.2.39 или bash-3.2.51):
$ ./sh-on-syntax-err
./sh-on-syntax-err: line 10: #: syntax error: operand expected (error token is "#")
status 1
Bad: has not aborted execution on syntax error!
$
Ну, мы не можем проверять $?
после каждого оператора, чтобы перехватить синтаксические ошибки.
(Я ожидал такого безопасного поведения от разумного языка программирования ... возможно, об этом нужно сообщать как об ошибке / желании заразить разработчиков)
Больше экспериментов
if
не имеет значения.
Удаление if
:
#!/bin/bash
set -e # exit on any error
readonly a=(1 2)
# A syntax error is here:
(( "${a[#]}" == 2 ))
echo status $?
echo 'Bad: has not aborted execution on syntax error!'
Результат:
$ ./sh-on-syntax-err
./sh-on-syntax-err: line 6: #: syntax error: operand expected (error token is "#")
status 1
Bad: has not aborted execution on syntax error!
$
Возможно, это связано с упражнением 2 из http://mywiki.wooledge.org/BashFAQ/105 и связано с чем-то (( ))
. Но я считаю, что все еще нецелесообразно продолжать выполнять синтаксическую ошибку.
Нет, (( ))
не имеет значения!
Он ведет себя плохо даже без арифметического теста! Простой, простой скрипт:
#!/bin/bash
set -e # exit on any error
readonly a=(1 2)
# A syntax error is here:
echo "${a[#]}"
echo status $?
echo 'Bad: has not aborted execution on syntax error!'
Результат:
$ ./sh-on-syntax-err
./sh-on-syntax-err: line 6: #: syntax error: operand expected (error token is "#")
status 1
Bad: has not aborted execution on syntax error!
$
set -e
не сработало. Но мой вопрос все еще имеет смысл. Можно ли отменить любую синтаксическую ошибку?
set -e
недостаточно, потому что ваша синтаксическая ошибка вif
утверждении. В любом другом месте следует прервать сценарий.