บรรทัดเดียวที่มี 2 ไฟล์ tmp (ไม่ใช่สิ่งที่คุณต้องการ) จะเป็น:
foo | bar > file1.txt && baz | quux > file2.txt && diff file1.txt file2.txt
ด้วยทุบตีคุณอาจลอง:
diff <(foo | bar) <(baz | quux)
foo | bar | diff - <(baz | quux) # or only use process substitution once
รุ่นที่ 2 จะเตือนคุณอย่างชัดเจนมากขึ้นว่าอินพุตใดที่แสดงหรือ
-- /dev/stdin
เทียบกับ++ /dev/fd/63
อะไรบางอย่างแทนที่จะเป็น fds ที่มีหมายเลขสองชุด
ไม่แม้แต่ไพพ์ที่มีชื่อจะปรากฏในระบบไฟล์อย่างน้อยใน OSes ที่ bash สามารถใช้การทดแทนกระบวนการโดยใช้ชื่อไฟล์ที่ต้องการ/dev/fd/63
รับชื่อไฟล์ที่คำสั่งสามารถเปิดและอ่านจากจริง ๆ แล้วอ่านจาก descriptor ไฟล์ที่เปิดอยู่แล้ว ก่อนที่จะรันคำสั่ง (เช่น bash ใช้pipe(2)
ก่อน fork แล้วจึงdup2
เปลี่ยนเส้นทางจากเอาต์พุตของquux
ไปยัง file file descriptor สำหรับdiff
บน fd 63)
บนระบบที่ไม่มี "เวทมนต์" /dev/fd
หรือ/proc/self/fd
ทุบตีอาจใช้ pipes ที่มีชื่อเพื่อใช้การทดแทนกระบวนการ แต่อย่างน้อยก็จะจัดการได้เองซึ่งแตกต่างจากไฟล์ชั่วคราวและข้อมูลของคุณจะไม่ถูกเขียนลงในระบบไฟล์
คุณสามารถตรวจสอบวิธีการทุบตีดำเนินการทดแทนด้วยecho <(true)
การพิมพ์ชื่อไฟล์แทนการอ่านจากมัน มันพิมพ์/dev/fd/63
บนระบบ Linux ทั่วไป หรือสำหรับรายละเอียดเพิ่มเติมเกี่ยวกับสิ่งที่ระบบเรียกใช้ bash คำสั่งนี้บนระบบ Linux จะติดตามไฟล์และการเรียกระบบของ file-descriptor
strace -f -efile,desc,clone,execve bash -c '/bin/true | diff -u - <(/bin/true)'
โดยไม่ต้องทุบตีคุณสามารถทำให้ไปป์ที่มีชื่อ ใช้-
เพื่อบอกdiff
ให้อ่านอินพุตหนึ่งจาก STDIN และใช้ไพพ์ที่มีชื่อเป็นตัวอื่น:
mkfifo file1_pipe.txt
foo|bar > file1_pipe.txt && baz | quux | diff file1_pipe.txt - && rm file1_pipe.txt
โปรดทราบว่าคุณสามารถไพพ์หนึ่งเอาต์พุตไปยังหลายอินพุตด้วยคำสั่ง tee:
ls *.txt | tee /dev/tty txtlist.txt
คำสั่งดังกล่าวจะแสดงผลลัพธ์ของ ls * .txt ไปยังเทอร์มินัลและส่งออกไปยังไฟล์ข้อความ txtlist.txt
แต่ด้วยการทดแทนกระบวนการคุณสามารถใช้tee
ฟีดข้อมูลเดียวกันในหลาย ๆ ท่อ:
cat *.txt | tee >(foo | bar > result1.txt) >(baz | quux > result2.txt) | foobar
mkfifo a; cmd >a& cmd2|diff a -; rm a