Ai đó có thể giải thích hành vi bash / set -e trên đoạn mã dưới đây không?
#!/bin/bash
# Comment if you want to test the trap only
set -e -o pipefail -u -E
# Comment if you want to test the set -e only
trap "echo ERROR CAUGHT; exit 12" ERR
function reproduce() {
# Trigger arithmetic error on purpose
a=$((1109962735 - hello=12272 + 1))
}
reproduce
# The script is expected to trigger the trap and/or activate the set -e. In both cases it should stop and exit here on error.
status_code=$?
echo "STATUS ${status_code}"
if [[ "${status_code}" != "0" ]];then
echo "FIXME: why was status code not caught by set -e ?"
echo "Executing false to prove set -e is still active"
false
# If the following is not executed then it proves -e is still active
echo "set -e not active !!!!!"
exit 2
fi
Đây là những gì có được khi thực hiện nó:
$ bash reproduce.sh
reproduce.sh: line 8: 1109962735 - hello=12272 + 1: attempted assignment to non-variable (error token is "=12272 + 1")
STATUS 1
FIXME: why was status code it not caught by set -e ?
Executing false to prove set -e is still active
ERROR CAUGHT
Kiểm tra mã thoát
$ echo $?
1
Phiên bản Bash
bash --version
GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
Sinh sản cũng với
GNU bash, version 4.4.12(1)-release (x86_64-pc-linux-gnu)
Ghi chú bổ sung, liên quan đến ý kiến (dù sao cũng nhờ tất cả các đề xuất):
- Bình luận bẫy không thay đổi hành vi kỳ lạ quan sát được
- Xóa bộ -e để chỉ giữ bẫy cũng kích hoạt bẫy
trap
cơ chế thay thế, ví dụ trap "exit 2" ERR
. Ngoài ra, đối với tôi, tập lệnh của bạn chỉ in "TÌNH TRẠNG 0". Có vẻ như bẫy ERR không được kế thừa bởi các hàm shell, điều này có giúp ích set -o errtrace
gì không? Nếu không, hãy xem liên kết của tôi ở trên về lý do tại sao bạn nên tránh set -e
ở nơi đầu tiên.
set -e
vớitrap
.trap
được gọi do lỗi và "echo ERROR CAUGHT" được gọi. Tôi có ấn tượngtrap
có độ ưu tiên cao hơnset -e
. Cũng theo Bash FAQ tôi nghĩset -e
là không khuyến khích, vui lòng kiểm tra mywiki.wooledge.org/BashFAQ/105 .