Tôi đã đọc qua nhiều câu hỏi trên các trang web trao đổi ngăn xếp khác nhau và các diễn đàn trợ giúp unix về cách sửa đổi các tùy chọn shell và sau đó khôi phục chúng - câu hỏi toàn diện nhất tôi tìm thấy ở đây là tại Làm thế nào để "hoàn tác" một `set -x`?
Sự khôn ngoan nhận được dường như là để lưu kết quả của set +o
hoặc shopt -po
sau eval
đó để khôi phục các cài đặt trước đó.
Tuy nhiên, trong thử nghiệm của riêng tôi với bash 3.x và 4.x, errexit
tùy chọn không được lưu chính xác khi thực hiện thay thế lệnh.
Dưới đây là một kịch bản ví dụ để hiển thị vấn đề:
set -o errexit
set -o nounset
echo "LOCAL SETTINGS:"
set +o
OLDOPTS=$(set +o)
echo
echo "SAVED SETTINGS:"
echo "$OLDOPTS"
Và đầu ra (tôi đã cắt bớt một số biến không liên quan):
LOCAL SETTINGS:
set -o errexit
set -o nounset
SAVED SETTINGS:
set +o errexit
set -o nounset
Điều này có vẻ cực kỳ nguy hiểm. Hầu hết các tập lệnh tôi viết phụ thuộc vào errexit
việc dừng thực thi nếu có bất kỳ lệnh nào bị lỗi. Tôi chỉ tìm thấy một lỗi trong một trong các tập lệnh của mình do lỗi này gây ra, trong đó chức năng được cho là khôi phục errexit
ở phần cuối đã ghi đè lên nó, đặt nó trở lại mặc định tắt trong suốt thời gian của tập lệnh.
Những gì tôi muốn có thể làm là viết các hàm có thể đặt tùy chọn khi cần và sau đó khôi phục tất cả các tùy chọn đúng trước khi thoát. Nhưng có vẻ như trong lớp con được gọi bằng lệnh thay thế, errexit
không được kế thừa.
Tôi không biết làm cách nào để cứu kết quả set +o
mà không sử dụng thay thế lệnh hoặc nhảy qua các vòng của FIFO. Tôi có thể đọc từ $SHELLOPTS
nhưng nó không thể ghi hoặc không thể eval
định dạng.
Tôi biết một cách khác là sử dụng hàm subshell , nhưng điều đó gây ra rất nhiều vấn đề đau đầu vì có thể đăng nhập đầu ra cũng như truyền lại nhiều biến.
Có thể liên quan: /programming/29532904/bash-subshell-errexit-semantics (có vẻ như có một cách giải quyết cho bash 4.4 trở lên nhưng tôi muốn có một giải pháp di động)
shopt
các tùy chọn bash set (như nullglob).