เหตุใดหลายคำสั่งจึงมีตัวเลือก“ เงียบ”?


37

เหตุใดหลายคำสั่งจึงมีตัวเลือก-qหรือ--quietระงับเอาต์พุตเมื่อคุณสามารถทำสิ่งเดียวกันได้อย่างง่ายดายโดยเปลี่ยนเส้นทางเอาต์พุตมาตรฐานไปยังไฟล์ null


3
ฉันคิดว่าส่วนใหญ่เป็นธงอำนวยความสะดวก
Janis

7
ไม่ใช่คำสั่งทั้งหมดที่ใช้-qเพื่อระงับเอาต์พุตทั้งหมด ตัวอย่างเช่น Docker มีคำสั่งเพื่อแสดงรูปภาพ docker imagesแสดงตารางที่จัดรูปแบบพร้อมกับข้อมูลจำนวนมากในขณะที่docker images -qแสดงรายการ ID ภาพแบบธรรมดา (มีประโยชน์สำหรับการไพพ์ไปยังคำสั่งอื่น)
new123456

คำตอบ:


71
  • ในขณะที่คุณสามารถเปลี่ยนเส้นทางในเชลล์ได้อย่างง่ายดายมีบริบทอื่น ๆ ที่ไม่ง่ายเหมือนเมื่อดำเนินการคำสั่งในภาษาอื่นโดยไม่ต้องใช้เชลล์บรรทัดคำสั่ง แม้ในเปลือก:

    find . -type f -exec grep -q foo {} \; -printf '%s\n'

    fooพิมพ์ขนาดของไฟล์ทั้งหมดที่มี หากคุณเปลี่ยนเส้นทางไป/dev/nullคุณจะสูญเสียทั้งสองfindและgrepส่งออก คุณจะต้องหันไปใช้-exec sh -c 'exec grep foo "$1" > /dev/null' sh {} \;(นั่นคือวางไข่เปลือกพิเศษ)

  • grep -q foo พิมพ์สั้นกว่า grep foo > /dev/null
  • การเปลี่ยนเส้นทางไปยัง/dev/nullหมายความว่าเอาต์พุตยังคงถูกเขียนและถูกละทิ้งแล้วซึ่งมีประสิทธิภาพน้อยกว่าการไม่เขียน (และไม่จัดสรรให้เตรียมเอาต์พุตที่จะเขียน)
  • ที่ช่วยเพิ่มประสิทธิภาพต่อไป ในกรณีของgrepตัวอย่างเช่นตั้งแต่ที่มี-q, grepรู้ว่าการส่งออกไม่จำเป็นต้องออกจากทันทีที่พบว่าการแข่งขันครั้งแรก ด้วยgrep > /dev/nullมันจะยังคงพยายามค้นหาการแข่งขันทั้งหมด
  • เงียบไม่ได้หมายความว่าเงียบ สำหรับบางคำสั่งหมายถึงลดการฟุ่มเฟื่อย (ตรงกันข้าม-v|--verbose) ยกตัวอย่างเช่นmplayerมีและ--quiet --really-quietด้วยบางคำสั่งคุณสามารถใช้-qqqเพื่อลดความละเอียด 3 ครั้งได้

เป็นที่น่าสังเกตว่าในgrepman-page ตัวเลือกทั้งสอง-qและ-sควรหลีกเลี่ยงหากการพกพาเป็นเรื่องที่น่ากังวล grepการออกก่อนกำหนดเป็นการเพิ่มประสิทธิภาพที่สำคัญ แต่ไม่ใช่ทุกโปรแกรมที่มีตัวเลือกดังกล่าวสามารถทำได้ curl -sจะยังคงประมวลผลข้อมูลทั้งหมด (แต่ยังคงใช้จุดที่ 3 ซึ่งช่วยประหยัดเวลาในการประมวลผล)
Janis

6
@ Janis ที่จะพกพาไปยังระบบเก่ามาก ทั้งสอง-qและ-sถูกระบุโดย POSIX หากเราจะต้องพิจารณาระบบที่เก่าแล้วฉันsh -c '...' sh {} \;จะไม่ทำงานอย่างใดอย่างหนึ่ง (ก่อนหน้านี้มีkshผลกระทบอย่างร้ายแรงshs)
Stéphane Chazelas

หน้าคนกล่าวถึง: grep สไตล์ USG ก็ขาด -q แต่ตัวเลือก -s มันทำตัวเหมือน GNU grep - ฉันคิดว่าความแตกต่างของพฤติกรรมอาจเป็นปัญหา ฉันไม่สามารถตัดสินเกี่ยวกับความเกี่ยวข้องของมัน
Janis

ฉันใช้ตัวเลือก -q และ - เงียบบ่อยครั้งเมื่อฉันสนใจเฉพาะโค้ดส่งคืนของคำสั่งในสคริปต์ เหตุผลที่ระบุไว้ข้างต้นเป็นตัวอย่างที่ดียิ่งขึ้นว่าทำไม
Mark Stewart

@ StéphaneChazelas: คุณจะประหลาดใจว่า (ส่วนหนึ่งของ) ระบบจำนวนมากยังคงอายุเท่าไหร่ ... (จริง ๆ แล้วไม่มาก ^^ แต่ยังมีบางอย่าง)
Olivier Dulac

3

มันยังช่วยให้คำสั่งที่จะนำออกมาเมื่อมันรู้สึกว่ามันจำเป็นต้องทราบไปที่หน้าจอ แต่โดยปกติมันไม่ทำให้อะไรออกมา ด้วยการเปลี่ยนเส้นทางทั้งหมดเป็นโมฆะไม่มีโอกาสที่จะเห็นผลลัพธ์


เงียบหมายความว่าไม่มีการตอบสนอง มันจะไม่คาดคิดถ้าเราต้องการดูผลลัพธ์ (ในกรณีที่มีบางสิ่งที่ "จริง ๆ แล้ว" สำคัญต่อการพิมพ์ (ในกระบวนการที่แนบกับเทอร์มินัล) กระบวนการ tty / pty สามารถใช้งานได้โดยตรงโดยกระบวนการตัวอย่างสำหรับสิ่งนั้นอาจเป็นการสอบถามรหัสผ่านแบบโต้ตอบหรือ somesuch )
Janis

2

แม้ว่ามันอาจจะขึ้นอยู่กับคำสั่งจะส่งออกยังปิดการใช้งาน-q stderrวิธีนี้ช่วยให้กระสุนที่ไม่อนุญาตให้การจับคู่ stderr stdout (ฉันมองคุณcsh& & tcsh) เพื่อหลีกเลี่ยงเสียงรบกวน

บางโปรแกรมมีตัวเลือก "เงียบ" สำหรับสถานการณ์ที่อาจมีเอาต์พุตที่มีความหมายอื่น ๆ ซึ่งคุณไม่ต้องการให้มีข้อความสถานะยุ่งเหยิง -qหรือเทียบเท่าจะเงียบเอาท์พุทสถานะทุกโปรแกรมที่ช่วยให้กระแสข้อมูลบริสุทธิ์จากการพูดหรือtargzip


0

นอกจากการตอบรับที่ดีและคะแนนทั้งหมดข้างต้นแล้ว เป็นวิธีปฏิบัติที่ดีที่สุดในการจัดเตรียมตัวเลือกที่ตรงกันข้ามสำหรับทุกธง ดังนั้นหากมี -v สำหรับการใช้คำฟุ่มเฟือยควรมี -q สำหรับการไม่ใช้คำฟุ่มเฟือยค่อนข้างหรือเงียบ (นี่ไม่ใช่จุดของการสนทนา แต่ ... ) เหมือนกับที่ควรเป็นตัวเลือกที่ยาวสำหรับทุก ๆ สั้น ๆ -q และ --quite

ในเกือบทุกอย่างในธุรกิจของเรามีหลายวิธีในการหาทางออกหรือผลลัพธ์เดียวกัน การมี -q เป็นหนึ่งในนั้น

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