为了安全起见,如果脚本遇到语法错误,我希望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!
$
好吧,我们不能$?
在每条语句后检查语法错误。
(我期望从明智的编程语言中获得这样的安全行为……也许这必须作为错误/希望报告给bash开发人员)
更多实验
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
语句中。其他任何地方都应该中止脚本。