`set -e` และ` grep` idiom เพื่อป้องกันการออกจาก shell script ก่อนเมื่อไม่พบ pattern


15

ต้องการความช่วยเหลือ - ในบริบทของเชลล์สคริปต์บน GNU / LINUX ทุบตี:

set -eฉันมักจะใช้ บ่อยครั้งที่ฉันต้องการgrepและไม่ต้องการให้สคริปต์ยุติการทำงานหากgrepมีสถานะออกจากการ1ระบุรูปแบบที่ไม่พบ

บางครั้งฉันได้พยายามที่จะแก้ปัญหานี้มีดังนี้:

(ลองฉัน)
ถ้าset +o pipefailและเรียก grep ด้วยบางอย่างเช่นนี้grep 'p' | wc -lฉันจะได้รับพฤติกรรมที่ต้องการจนกว่าผู้ดูแลในอนาคตจะเปิดpipefailใช้งาน นอกจากนี้ฉันชอบเปิดใช้งานpipefailสิ่งนี้ไม่ได้ผลสำหรับฉัน

(ลอง II)
ใช้รูปแบบการจับคู่ลายเส้นและsedหรือawkเท่านั้นจากนั้นwcจับคู่บรรทัดเพื่อทดสอบรูปแบบที่ตรงกัน ฉันไม่ชอบตัวเลือกนี้เพราะใช้sedจะgrepดูเหมือนว่าวิธีแก้ปัญหาสำหรับปัญหาที่แท้จริงของฉัน

(ลอง III) อัน
นี้เป็นรายการโปรดของฉัน - สิ่งที่ชอบ:set +e; grep 'p'; set-e

ความเข้าใจ / สำนวนใด ๆ ที่จะได้รับการชื่นชมมากที่สุด - ขอบคุณ

คำตอบ:


19

คุณสามารถใส่ grep ใน if|| trueสภาพหรือถ้าคุณไม่สนใจเกี่ยวกับสถานะออกเพิ่ม

ตัวอย่าง: grepฆ่าเชลล์

$ bash
$ set -e
$ echo $$
33913
$ grep foo /etc/motd
$ echo $$
9233

โซลูชันที่ 1: ทิ้งสถานะการออกที่ไม่ใช่ศูนย์

$ bash
$ set -e
$ echo $$
34074
$ grep foo /etc/motd || true
$ echo $$
34074

โซลูชันที่ 2: ทดสอบสถานะการออกอย่างชัดเจน

$ if ! grep foo /etc/motd; then echo not found; fi
not found
$ echo $$
34074

จากหน้าคนทุบตีพูดคุยset -e:

เชลล์ไม่ได้ออกหากคำสั่งที่ล้มเหลวเป็นส่วนหนึ่งของรายการคำสั่งทันทีหลังจากนั้นสักครู่หรือจนกว่า คำสำคัญส่วนหนึ่งของการทดสอบจะตามด้วยคำว่า ifหรือelif ที่สงวนไว้ส่วนหนึ่งของคำสั่งที่ดำเนินการในรายการ &&หรือ││ยกเว้น คำสั่งที่ตามหลัง&&หรือ││สุดท้ายคำสั่งใด ๆ ในไปป์ไลน์ แต่สุดท้ายหรือถ้าค่าส่งคืนของคำสั่งกลับด้านด้วย! .


ระบุว่า bash เป็นเวลานานไม่ได้ใช้ -e อย่างถูกต้องอาจเป็นเพราะเอกสารยังไม่ถูกต้อง เนื่องจากข้อความดูเหมือนกับหน้า man bash-3.x โปรดทราบ: bash ทุกเวอร์ชันก่อนที่ bash4.0 จะใช้ -e อย่างไม่ถูกต้อง
schily

นอกจากนี้โปรดทราบว่าเนื่องจากมาตรฐาน POSIX ผิดเช่นกันเราเปลี่ยนข้อความ POSIX สำหรับการจัดการข้อผิดพลาดด้วย -e ในปี 2009
schily

1
@schily โปรดให้คำแนะนำแก่จุดที่อาจพบว่าพฤติกรรม 'ถูกต้อง' ของ -e คืออะไรทุบตี <4 แตกต่างกันและสิ่งที่เปลี่ยนแปลงใน POSIX
zwol

ข้อผิดพลาดในทุบตี -3 ทำให้มันใช้ไม่ได้makeเพราะมันไม่ได้ออกจากข้อผิดพลาดเสมอไป สำหรับการสนทนาที่เกี่ยวข้องกับ POSIX คุณอาจต้องการตรวจสอบaustingroupbugs.net
schily

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