ฉันจะไพพ์เอาต์พุตของคำสั่งหนึ่งไปยังอินพุตของอีกสองคำสั่งพร้อมกันได้อย่างไร?
ฉันจะไพพ์เอาต์พุตของคำสั่งหนึ่งไปยังอินพุตของอีกสองคำสั่งพร้อมกันได้อย่างไร?
คำตอบ:
ดูเหมือนว่าtee
คำสั่งจะทำในสิ่งที่คุณต้องการ
กุญแจสำคัญคือการใช้
>( )
สำหรับขั้นตอนการเปลี่ยนตัว ด้วยtee
ใช้รูปแบบต่อไปนี้:
tee >(proc1) >(proc2) >(proc3) | proc4
ดังนั้นหากคุณต้องการใช้เอาต์พุตls
เป็นอินพุตไปยังสองgrep
โปรแกรมที่ต่างกันให้บันทึกเอาต์พุตของแต่ละgrep
ไฟล์ไปยังไฟล์ที่แตกต่างกันและไพพ์ผลลัพธ์ทั้งหมดless
ให้ลอง:
ls -A | tee >(grep ^[.] > hidden-files) >(grep -v ^[.] > normal-files) | less
ผลลัพธ์ของการls -A
จะถูก "piped" ลงในทั้งสองgrep
s ไฟล์ที่hidden-files
จะมีเนื้อหาจากการส่งออกของแรกgrep
และจะมีผลของการที่สอง normal-files
grep
แก้ไข : สิ่งที่คุณเห็นในless
ไฟล์ทั้งหมดจะแสดงในเพจเจอร์less
เป็นผลผลิตที่แน่นอนเดียวกันของls -A
ไม่ได้ผลของgrep
s หากคุณต้องการแก้ไขผลลัพธ์จากls -A
เป็นless
(เช่นการสลับลำดับเพื่อให้ไฟล์ปกติอยู่ในรายการก่อนรายการที่ซ่อนอยู่) ให้ลองทำดังนี้:
ls -A | tee >(grep ^[.]) >(grep -v ^[.]) >/dev/null | less
หากไม่มี>/dev/null
เอาต์พุตของgrep
s จะถูกผนวกเข้ากับเอาต์พุตls -A
แทนที่จะแทนที่
ใช้ "ที"
ตัวอย่าง:
grep someSearchString someFile | tee /dev/tty | wc -l > grepresult
สิ่งนี้จะส่งเอาต์พุตของคำสั่ง grep ไปยังทั้งเทอร์มินัลและไปยังwc (ซึ่งเอาต์พุตจะถูกเปลี่ยนเส้นทางไปยังไฟล์ grepresult)
"ตี๋" จะมีการอธิบายไว้ในบทความวิกิพีเดียที (คำสั่ง) ศูนย์กลางคือ: "คำสั่ง tee อ่านอินพุตมาตรฐานจากนั้นเขียนเนื้อหาลงในเอาต์พุตมาตรฐานและคัดลอกลงในไฟล์หรือตัวแปรที่ระบุพร้อมกัน"