ทำไมคำสั่ง grep นี้ไม่ทำงาน?


24

เมื่อฉันพยายามใช้ grep ในแบบนี้:

service --status-all | grep network

มันยังคงแสดงรายการบริการทั้งหมดแม้ว่าฉันจะวางมันลงgrepเพื่อ จำกัด ไว้ที่สตริง "เครือข่าย" เท่านั้น


ตามความเป็นจริง:

สังเกตเห็นบทความนี้ที่อธิบายว่าทำไมคำสั่งทำงานในลักษณะนี้เป็นสิ่งที่ฉันชอบเกี่ยวกับ linux มีเหตุผลที่ดีอยู่เสมอ แต่ไม่จำเป็นต้องหยั่งรู้

คำตอบ:


41

ลอง:

service --status-all |& grep network

แอ็พพลิเคชันบรรทัดคำสั่งสามารถพิมพ์ไปยังสองสตรีมข้อความที่เรียกว่าstandard out (stdout) และข้อผิดพลาดมาตรฐาน (stderr) โดยค่าเริ่มต้นเทอร์มินัลเพียงแสดงผลลัพธ์สำหรับทั้งสองเหมือนกัน

stdout จะได้รับหมายเลข 1 และ stderr จะได้รับจำนวน 2 โดยค่าเริ่มต้นผู้ประกอบการเปลี่ยนเส้นทางเช่น>, |และ<จะใช้เฉพาะกับ stdout จำนวน 1

|&ไปป์ทั้ง stdout และ stderr พร้อมกันกับกระบวนการของสตรีมอินพุตมาตรฐาน (stdin) ที่ถูกต้องซึ่งทำให้grepทำงานได้ตามที่คุณคาดหวัง

ฉันไม่รู้ว่าทำไมservice --status-allการพิมพ์ถึง stderr ที่นี่ แต่โดยทั่วไปการมี stderr stream แยกต่างหากนั้นมีประโยชน์มากเพราะช่วยให้คุณเห็นข้อผิดพลาดแม้ว่า stdout จะถูกปิดเสียง


ขอบคุณสำหรับคำตอบดูเหมือนว่าสิ่งนี้ได้สร้างความสนใจอย่างมาก ดังนั้นฉันคิดว่าฉันไม่ใช่คนเดียวที่มีปัญหานี้
Meer Borg

4

คุณต้องเปลี่ยนเส้นทางสตรีมข้อผิดพลาดมาตรฐาน ( 2) ไปยังเอาต์พุตมาตรฐาน ( 1):

service --status-all 2>&1 | grep network

ผู้ให้บริการ>ตามปกติจะเปลี่ยนเส้นทางไปยังไฟล์ (เช่น2>/tmp/file) ในการเปลี่ยนเส้นทางไปยังสตรีมอื่น ๆ โดยใช้descriptorจะต้องนำหน้าด้วย&(ไม่ต้องเว้นวรรคระหว่างอักขระ)

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