ทำไม grep ไม่ใช้ท่อถึงทำงานที่นี่?


18

ฉันมีคำสั่งดังต่อไปนี้:

find / -name libGL.so.1

ซึ่งส่งคืนบรรทัดจำนวนมากด้วย "การอนุญาตที่ถูกปฏิเสธ" ฉันต้องการยกเว้นบรรทัดดังกล่าวดังนั้นฉันจึงเพิ่มสิ่งต่อไปนี้:

find / -name libGL.so.1 | grep -v 'denied'

แต่ผลลัพธ์คือเดียวกัน - ฉันไม่ได้กรองบรรทัดที่มีgrep -v 'denied' Permission deniedฉันลองหลายรูปแบบดูบทเรียน grep แต่ฉันไม่สามารถเข้าใจปัญหาได้ ข้อเสนอแนะใด ๆ

คำตอบ:


43

ที่ไม่มีอะไรจะทำอย่างไรกับgrep- มันเป็นเพราะท่อ|เปลี่ยนเส้นทางกระแสออกมาตรฐานstdoutในขณะที่ข้อความที่อยู่ในกระแสข้อผิดพลาดมาตรฐานPermission denied stderrคุณสามารถบรรลุผลที่คุณต้องการโดยการรวมลำธารใช้2>&1(เปลี่ยนเส้นทางกระแสที่มีคำอธิบายถึงไฟล์2ไปยังสตรีมที่มีคำอธิบายถึงไฟล์1) เพื่อให้stderrเช่นเดียวกับstdoutที่ได้รับการประปาเพื่อป้อนคำสั่ง grep

find / -name libGL.so.1 2>&1 | grep -v 'denied'

แต่มันจะเป็นเรื่องปกติที่จะทิ้งstderrมันไปพร้อม ๆ/dev/null

find / -name libGL.so.1 2>/dev/null

ใช้ | & แทน 2> & 1 |

หากคุณดูที่หน้า Bash man คุณอาจสังเกตเห็นการแจ้งเตือนนี้:

หาก|&ใช้ข้อผิดพลาดมาตรฐานของคำสั่งจะเชื่อมต่อกับอินพุตมาตรฐานของ command2 ผ่านไพพ์ 2>&1 |มันเป็นชวเลข

ดังนั้นคุณสามารถใช้โครงสร้างนี้เช่นกันหากคุณต้องการเข้าร่วม STDERR และ STDOUT:

find / -name libGL.so.1 |& grep -v 'denied'

3
ทราบเพิ่มเติมเกี่ยวกับการรวมพวกเขา: ถ้าด้วยเหตุผลที่แปลกประหลาดบางไฟล์ที่มีอยู่ใน/foo/bar/denied/libGL.so.1การรวมstdoutและstderr จากนั้นกรองจะซ่อนผล
Izkata

5

คำสั่งของคุณควรเป็น:

find / -name libGL.so.1 2>/dev/null

ค้นหากำลังบ่นเกี่ยวกับสิทธิ์ในข้อผิดพลาดมาตรฐาน (fd2) ในการกำจัดบรรทัดเหล่านั้นให้เปลี่ยนเส้นทาง (>) มาตรฐานไปยังที่เก็บข้อมูลบิต (/ dev / null)


4

บรรทัด "การอนุญาตที่ถูกปฏิเสธ" กำลังไปที่สตรีม stderr (ข้อผิดพลาดมาตรฐาน) แต่คุณกำลังไพพ์ stdout (ออกมาตรฐาน) ผ่าน grep

คุณสามารถเปลี่ยนเส้นทาง stderr ไปทั้งหมดด้วย

find / -name libGL.so.1 2> /dev/null

2

คุณได้ลองเรียกคำสั่งด้วยsudoหรือไม่?

sudo find / -name libGL.so.1

หากยังคงแสดงข้อความให้ใช้การเปลี่ยนเส้นทางที่กล่าวถึงแล้วของstderr (fd = 2) เพื่อนิพพาน (/ dev / null) :

sudo find / -name libGL.so.1 2> /dev/null

แนวคิดเพิ่มเติมที่นี่โชคดี!

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