Có thể kiểm tra xem -e có được đặt trong tập lệnh bash không?


9

Nếu một hàm shell cần một cài đặt cụ thể là -e / + e để hoạt động, có thể đặt cài đặt đó cục bộ và sau đó khôi phục lại cài đặt trước đó trước khi thoát khỏi chức năng không?

myfunction()
{
   # Query here if -e is set and remember in a variable?
   # Or push the settings to then pop at the end of the function?
   set +e
   dosomething
   doanotherthing
   # Restore -e/+e as appropriate, don't just do unconditional   set -e
}

Câu trả lời:


12

Bạn có các cờ hiện được đặt trong biến $-, vì vậy bạn có thể bảo toàn điều này khi bắt đầu chức năng và khôi phục nó sau.

save=$-
...
if [[ $save =~ e ]]
then set -e
else set +e
fi

Cần lưu ý rằng nó $-cũng hoạt động /bin/shvà có lẽ bạn không cần bashism để phân tích nó, chỉ cần sử dụng ví dụ: Globing casecung cấp
Josip Rodin

2

Bạn có thể đọc giá trị cờ thông qua biến SHELLOPTS:

  > set +e 
  > echo $SHELLOPTS
    braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor
  > set -e 
  > echo $SHELLOPTS
    braceexpand:emacs:errexit:hashall:histexpand:history:interactive-comments:monitor

Bạn thấy rằng, sau khi thiết lập set -e, giá trị errexittrong $SHELLOPTSxuất hiện. Bạn có thể kiểm tra nó từ đó.

Tuy nhiên, bạn có thể khắc phục điều này (nếu bạn muốn!) Bằng cách ghi nhớ điểm sau: theo Hướng dẫn :

-e :

..... Tùy chọn này áp dụng cho môi trường shell và từng môi trường subshell riêng biệt.

Vì vậy, nếu bạn thực hiện chức năng của mình trong một lớp con, như

   zz="$(myfunction)"

bạn không phải lo lắng liệu errexitbiến đó có được đặt hay không trong môi trường gọi và bạn có thể đặt biến đó theo ý muốn.


Cảm ơn, SHELLOPTS là hữu ích để nhận thức được. Mặc dù vậy, tôi thấy $ - được đề xuất bởi @meuh dễ dàng hơn để kiểm tra theo chương trình, đó là lý do tại sao tôi chấp nhận câu trả lời đó.
usta

Lưu ý về subshells cũng hữu ích, nhưng tôi muốn tránh sửa đổi các trang web cuộc gọi. Nếu không, tôi có thể thay đổi myfunctioncác cuộc gọi để myfunction || truetriệt tiêu hiệu ứng của -e cho các cuộc gọi và không phải thực hiện set +ebên trong chức năng ở vị trí đầu tiên.
usta

@MariusMatutiae: 20000 chúc mừng.
Scott
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.