Tôi nghĩ rằng set -e
có tác dụng tương tự đối với các lớp con như trên lớp vỏ cấp cao nhất. Rõ ràng là không. Điều này:
(
set -e
false
true
) || echo false1
bash -ec '
set -e
false
true
' || echo false2
bash <<EOF || echo false3
set -e
false
true
EOF
bash <<EOF || echo false4
false
true
EOF
bash <<EOF || echo false5
false &&
true
EOF
Bản in
false2
false3
false5
Tài liệu này ở đâu? Tôi có thể nhận được các chuỗi con để chấm dứt lỗi, mà không kết nối tất cả các lệnh của chúng với &&
(hoặc không thực hiện || exit $?
sau mỗi lệnh) không?
Biên tập:
Trường hợp sử dụng cụ thể của tôi là một cái gì đó như:
set -e
# ...
status=0
( false; true ) || status=$?
report_code $status
return $status
Trong đó nội dung của subshell là mã thực tế của tôi. Vấn đề với điều này là nó luôn đặt trạng thái thành 0 và thay thế ||
bằng ;
nguyên nhân thoát lỗi không mong muốn do tập hợp bên ngoài -e.
Tôi đã giải quyết nó bằng:
set -e
# ...
set +e
( false; true ); status=$?
set -e
report_code $status
return $status
Tôi ước tôi đã không phải làm điều này, nhưng nó xuất hiện tất cả các shell thông thường cho thấy sự phân đôi giữa thực thi và phân tách chỉ phụ này:
#!/bin/sh
echo FORK\'D:
export SH
for SH in dash bash ksh zsh; do
$SH -c 'st=0; ( set -e; false; true ) || st=$?; printf "%s\t%s\n" $SH $st; '
done
echo EXEC\'D:
for SH in dash bash ksh zsh; do
$SH -c 'st=0; '$SH' -c " set -e; false; true " || st=$?; printf "%s\t%s\n" $SH $st; '
done
ĐẦU RA:
FORK'D:
dash 0
bash 0
ksh 0
zsh 0
EXEC'D:
dash 1
bash 1
ksh 1
zsh 1
-e
phần tài liệu của bộ .