เป็นไปได้ไหมที่จะตรวจสอบว่า -e ตั้งค่าไว้ในสคริปต์ทุบตี


8

หากฟังก์ชั่นเชลล์ต้องการการตั้งค่าเฉพาะของ -e / + e เพื่อให้ทำงานได้เป็นไปได้หรือไม่ที่จะตั้งค่านั้นแบบโลคัลและจากนั้นเรียกคืนเป็นการตั้งค่าก่อนหน้า

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
}

คำตอบ:


8

คุณมีการตั้งค่าสถานะปัจจุบันในตัวแปร $-ดังนั้นคุณสามารถรักษาสิ่งนี้ไว้ ที่จุดเริ่มต้นของฟังก์ชั่นและเรียกคืนหลังจาก

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

ควรสังเกตว่า $- ยังใช้งานได้ /bin/sh และคุณอาจไม่ต้องการ bashisms ในการแยกวิเคราะห์เพียงใช้เช่น พร่ามัว case ให้
Josip Rodin

1

คุณสามารถอ่านค่าสถานะผ่านตัวแปร 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

คุณจะเห็นว่าหลังจากการตั้งค่า set -e, มูลค่า errexit ใน $SHELLOPTS ปรากฏ คุณสามารถตรวจสอบได้จากที่นั่น

อย่างไรก็ตามคุณสามารถหลีกเลี่ยงปัญหานี้ได้ (ถ้าคุณต้องการ!) โดยจดจำจุดต่อไปนี้: คู่มือการใช้งาน :

-e :

.....   ตัวเลือกนี้ใช้กับสภาพแวดล้อมของเชลล์และแต่ละสภาพแวดล้อมของเชลล์ย่อยแยกกัน

ดังนั้นหากคุณดำเนินการฟังก์ชั่นของคุณใน subshell เช่น

   zz="$(myfunction)"

คุณไม่ต้องกังวลว่า errexit ตัวแปรถูกตั้งค่าหรือไม่อยู่ในสภาพแวดล้อมการโทรและคุณสามารถตั้งค่าได้ตามที่คุณต้องการ


ขอบคุณ SHELLOPTS มีประโยชน์ที่ควรระวัง ฉันพบว่า $ - แนะนำโดย @meuh ง่ายต่อการตรวจสอบโดยทางโปรแกรมแม้ว่านั่นเป็นเหตุผลที่ฉันยอมรับคำตอบนั้น
usta

หมายเหตุเกี่ยวกับ subshells มีประโยชน์เช่นกัน แต่ฉันต้องการหลีกเลี่ยงการแก้ไขไซต์การโทร มิฉะนั้นฉันอาจจะเปลี่ยน myfunction โทรไปที่ myfunction || true เพื่อระงับผลกระทบของ -e สำหรับการโทรและไม่ต้องทำ set +e ภายในฟังก์ชั่นในสถานที่แรก
usta

@MariusMatutiae: ขอแสดงความยินดี 20,000
Scott

@ Scott lol ขอบคุณ .... bit ประหลาดใจ
MariusMatutiae
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.