Để 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 -ekhô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 -ekhô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 -elà không đủ vì lỗi cú pháp của bạn nằm trong mộtifcâu lệnh. Bất cứ nơi nào khác nên hủy bỏ kịch bản.