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