Щоб бути в безпеці, я б хотів, щоб 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
операторі. Більше ніде слід скасувати сценарій.