안전 측면에서 bash는 구문 오류가 발생하면 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!
$
아마도 이것은 http://mywiki.wooledge.org/BashFAQ/105의 연습 2와 관련이 있으며 관련 이 있습니다 (( ))
. 그러나 구문 오류가 계속 발생하면 여전히 불합리합니다.
아니요, (( ))
차이가 없습니다!
산술 테스트 없이도 잘못 작동합니다! 간단하고 기본적인 스크립트 :
#!/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
명령문 에 있기 때문에 충분하지 않습니다 . 다른 곳에서는 스크립트를 중단해야합니다.