Để an toàn, tôi muốn bash hủy bỏ việc thực thi tập lệnh nếu nó gặp lỗi cú pháp.
Thật ngạc nhiên, tôi không thể đạt được điều này. ( set -e
không đủ.) Ví dụ:
#!/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!'
Kết quả (bash-3.2.39 hoặc 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!
$
Chà, chúng tôi không thể kiểm tra $?
sau mỗi câu lệnh để bắt lỗi cú pháp.
(Tôi mong đợi hành vi an toàn như vậy từ một ngôn ngữ lập trình hợp lý ... có lẽ điều này phải được báo cáo là lỗi / muốn làm bash các nhà phát triển)
Thêm thí nghiệm
if
không có sự khác biệt
Đang xóa 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!'
Kết quả:
$ ./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!
$
Có lẽ, nó liên quan đến bài tập 2 từ http://mywiki.wooledge.org/BashFAQ/105 và có liên quan (( ))
. Nhưng tôi thấy vẫn không hợp lý khi tiếp tục thực hiện lỗi sau cú pháp.
Không, (( ))
không có sự khác biệt!
Nó cư xử xấu ngay cả khi không có bài kiểm tra số học! Chỉ là một kịch bản đơn giản, cơ bản:
#!/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!'
Kết quả:
$ ./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
không hoạt động. Nhưng câu hỏi của tôi vẫn có ý nghĩa. Có thể hủy bỏ bất kỳ lỗi cú pháp?
set -e
là không đủ vì lỗi cú pháp của bạn nằm trong mộtif
câu lệnh. Bất cứ nơi nào khác nên hủy bỏ kịch bản.