ในระบบที่คล้าย Unix จะมีสองเส้นทางที่ไม่ได้ทำการแก้ไขจะส่งออกไปยังหน้าจอของคุณ ข้อผิดพลาดมาตรฐาน (หรือ stderr) เป็นข้อผิดพลาดที่พบมากที่สุดและเงื่อนไขข้อผิดพลาด
ในการส่งผ่านข้อความปฏิเสธสิทธิ์ใน stderr ไปยังสตรีมเอาต์พุตเดียวกันกับ "เอาต์พุตปกติ" คุณต้องรวมสองข้อความเข้าด้วยกัน ในตัวอย่างของคุณเพื่อให้คุณgrep -v
ใช้งานได้อย่างถูกต้องคุณรวม stdout (เอาต์พุตมาตรฐาน) และ stderr กับไวยากรณ์อาร์เคนที่คุณเห็น
จากGNU Bash manual section 3.2.2 Pipelines :
หาก|&
ใช้'' ข้อผิดพลาดมาตรฐานของcommand1นอกเหนือจากเอาต์พุตมาตรฐานจะเชื่อมต่อกับอินพุตมาตรฐานของcommand2 ผ่านไพพ์ 2>&1 |
มันเป็นชวเลข การเปลี่ยนทิศทางโดยนัยของข้อผิดพลาดมาตรฐานไปยังเอาต์พุตมาตรฐานถูกดำเนินการหลังจากการเปลี่ยนทิศทางใด ๆ ที่ระบุโดยคำสั่ง
นอกจากนี้ตามที่ geirha ชี้ให้เห็นถ้าคุณต้องการกำจัดเอาต์พุต stderr คุณจะต้องทำอะไรบางอย่างเช่น
find -name 'myfile.*' 2> /dev/null
หรือบางที
find -name 'myfile.*' 2> /tmp/errorlog
และโปรดทราบว่าหากคุณมีสตริงคำสั่งเช่นการfind
ส่งเอาต์พุตไปยังxargs
คุณจะต้องใส่ไพพ์ไลน์ของคำสั่งทั้งหมดในวงเล็บเพื่อจับเอาท์พุทจากส่วนประกอบทั้งหมดของคำสั่ง เช่น,
(find | egrep ^[RS].[0-9]+/.svg] | xargs head -1 ) 2> /dev/null
หากคุณออกจากวงเล็บและทำสิ่งนี้แทน -
find | egrep ^[RS].[0-9]+/.svg] | xargs head -1 2> /dev/null
คุณจะยังคงเห็นสิทธิ์ที่ถูกปฏิเสธข้อผิดพลาดจากการค้นหาหรือ egrep แต่ stderr จะถูกเปลี่ยนเส้นทางสำหรับ xargs
อย่างที่คุณเห็นคุณน่าจะทิ้ง stderr หลังจากดูเนื้อหาในระหว่างการทดสอบ
โปรดทราบว่าด้วย GNU find
และเท่าที่ฉันสามารถบอกได้ว่า POSIX ใด ๆ ที่find
เข้ากันได้-print
ตัวเลือกนั้นจะเป็นนัย คุณยังคงสามารถระบุได้หากคุณต้องการ