การเปลี่ยนเส้นทางเอาต์พุตของ grep ไปยัง / dev / null คืออะไร


24

พิจารณาบรรทัดนี้:

${libdir}/bin/licenseTool check "${SERIAL}" "${VERSION}" "${PRODUCT}" ${libdir} | grep '^200' >/dev/null

อะไรคือจุดของการมองหาลวดลายในผลลัพธ์ถ้าผลลัพธ์นั้นถูกโยนทิ้งไป?

และหากบรรทัดเช่นนั้นปรากฏขึ้นเป็นสิ่งสุดท้ายในสคริปต์ทุบตีค่าการออกของมันจะถูกส่งกลับไปยังผู้เรียกของสคริปต์หรือถูกละเว้น? (ฉันคาดเดาได้ว่าเราสามารถสันนิษฐานได้ว่าสิ่งนี้ทำเพื่อผลข้างเคียงเท่านั้นหรือส่งคืนบางสิ่งบางอย่างแก่ผู้โทร)

คำตอบ:


29

ความสงสัยของคุณถูกต้อง สถานะการออกของคำสั่งสุดท้ายของสคริปต์จะถูกส่งผ่านไปยังสภาพแวดล้อมการโทร ดังนั้นคำตอบก็คือสคริปต์นี้จะส่งคืนสถานะการออก 0 หากgrepจับคู่กับข้อมูลได้สถานะที่ 1 หากไม่มีการจับคู่และสถานะการออก 2 หากข้อผิดพลาดเกิดขึ้น


27

จุดของgrepเอาต์พุต ping ที่ถูกโยนทิ้งไปคือผู้เขียนต้องการเพียงสถานะการส่งคืนgrepเท่านั้น เขา / เธอต้องการทราบว่ารูปแบบนั้นตรงกันหรือไม่ ในกรณีของคุณที่ผ่านมาgrepตรวจสอบว่าการส่งออกคำสั่งก่อนหน้านี้ประกอบด้วยเส้นใด ๆ 200เริ่มต้นด้วย

ในระบบ POSIX ที่ทันสมัยคุณสามารถทำได้ด้วยgrep -qโดยไม่ต้องเปลี่ยนเส้นทางไปที่/dev/null:

... | grep -q '^200'

โปรดทราบว่าการใช้grep -qมีผลข้างเคียงเล็กน้อยขอบคุณStéphane Chazelas ที่ชี้ให้เห็นในความคิดเห็นของเขา grep -qออกจากทันทีที่พบการแข่งขันครั้งแรกหากlicenseToolยังคงเขียนอะไรบางอย่างหลังจากgrepออกมาก็จะได้รับ SIGPIPE


2
และgrep -qใช้ CPU น้อยลง
Skaperen

5
เมื่อสิ่งเหล่านี้ไปgrep -qถูกเพิ่มเข้ามาค่อนข้างเร็ว ๆ นี้ สคริปต์จำนวนมากยังคงใช้> /dev/nullแทนเพราะนั่นคือทั้งหมดที่คุณได้รับในยุคน้ำแข็ง (นั่นคือ 1995)
zwol

3
ประโยคแรกของคุณไม่มีคำกริยาหรือไม่?
อัล

ความไม่เท่าเทียมกันระหว่าง "grep -q" และ "grep> / dev / null" จาก GNU manpage: "อย่างไรก็ตามหากใช้ -q หรือ --quiet หรือ --silent และบรรทัดถูกเลือกสถานะทางออกคือ 0 แม้ว่าจะเกิดข้อผิดพลาด "
ทำเครื่องหมาย

หากเอกสารถูกต้อง "สถานะการออกเป็น 0 แม้ว่าจะเกิดข้อผิดพลาด" ... ฉันคิดว่า-qตัวเลือกดูไม่เหมาะสม ... เพราะคุณต้องการให้รู้เกี่ยวกับข้อผิดพลาดโดยการตรวจสอบสถานะการออก
เทรเวอร์บอยด์สมิ ธ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.