สามารถส่งเอาต์พุตของคำสั่งเดียวไปยังอีกสองคำสั่งได้หรือไม่?


คำตอบ:


56

ดูเหมือนว่า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-filesgreplessไฟล์ทั้งหมดจะแสดงในเพจเจอร์ แก้ไข : สิ่งที่คุณเห็นในlessเป็นผลผลิตที่แน่นอนเดียวกันของls -Aไม่ได้ผลของgreps หากคุณต้องการแก้ไขผลลัพธ์จากls -Aเป็นless(เช่นการสลับลำดับเพื่อให้ไฟล์ปกติอยู่ในรายการก่อนรายการที่ซ่อนอยู่) ให้ลองทำดังนี้:

ls -A | tee >(grep ^[.]) >(grep -v ^[.]) >/dev/null | less

หากไม่มี>/dev/nullเอาต์พุตของgreps จะถูกผนวกเข้ากับเอาต์พุตls -Aแทนที่จะแทนที่

แหล่ง


3
อันนี้ดีมาก!
hayalci

3
+1 เพราะแม้หลังจาก 10 ปีของการเขียนสคริปต์เชลล์ฉันไม่เคยเห็นสิ่งนี้มาก่อน!
jtimberman

6

ใช้ "ที"

ตัวอย่าง:

grep someSearchString someFile | tee /dev/tty | wc -l > grepresult

สิ่งนี้จะส่งเอาต์พุตของคำสั่ง grep ไปยังทั้งเทอร์มินัลและไปยังwc (ซึ่งเอาต์พุตจะถูกเปลี่ยนเส้นทางไปยังไฟล์ grepresult)

"ตี๋" จะมีการอธิบายไว้ในบทความวิกิพีเดียที (คำสั่ง) ศูนย์กลางคือ: "คำสั่ง tee อ่านอินพุตมาตรฐานจากนั้นเขียนเนื้อหาลงในเอาต์พุตมาตรฐานและคัดลอกลงในไฟล์หรือตัวแปรที่ระบุพร้อมกัน"

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