วิธีที่ดีในการหาความแตกต่างระหว่างพวกเขาคือทำการทดลองเล็กน้อยบนบรรทัดคำสั่ง แม้จะมีความคล้ายคลึงกันทางสายตาในการใช้<
ตัวละคร แต่ก็ทำสิ่งที่แตกต่างจากการเปลี่ยนเส้นทางหรือไพพ์
ลองใช้date
คำสั่งสำหรับการทดสอบ
$ date | cat
Thu Jul 21 12:39:18 EEST 2011
นี่เป็นตัวอย่างที่ไม่มีจุดหมาย แต่ก็แสดงให้เห็นว่าcat
ยอมรับเอาท์พุทของdate
บน STDIN และคายมันออกมา ผลลัพธ์เดียวกันสามารถทำได้โดยการทดแทนกระบวนการ:
$ cat <(date)
Thu Jul 21 12:40:53 EEST 2011
อย่างไรก็ตามสิ่งที่เพิ่งเกิดขึ้นหลังฉากแตกต่างกัน แทนที่จะได้รับกระแส STDIN cat
จริง ๆ แล้วผ่านชื่อของไฟล์ที่จำเป็นต้องเปิดและอ่าน คุณสามารถดูขั้นตอนนี้โดยใช้แทนecho
cat
$ echo <(date)
/proc/self/fd/11
เมื่อ cat ได้รับชื่อไฟล์มันจะอ่านเนื้อหาของไฟล์ให้เรา ในทางกลับกันเสียงก้องเพิ่งแสดงชื่อไฟล์ที่ส่งผ่านให้เรา ความแตกต่างนี้ชัดเจนมากขึ้นถ้าคุณเพิ่มการทดแทนเพิ่มเติม:
$ cat <(date) <(date) <(date)
Thu Jul 21 12:44:45 EEST 2011
Thu Jul 21 12:44:45 EEST 2011
Thu Jul 21 12:44:45 EEST 2011
$ echo <(date) <(date) <(date)
/proc/self/fd/11 /proc/self/fd/12 /proc/self/fd/13
เป็นไปได้ที่จะรวมการทดแทนกระบวนการ (ซึ่งสร้างไฟล์) และการเปลี่ยนเส้นทางอินพุต (ซึ่งเชื่อมต่อไฟล์กับ STDIN):
$ cat < <(date)
Thu Jul 21 12:46:22 EEST 2011
มันดูค่อนข้างเหมือนเดิม แต่คราวนี้ cat ผ่าน STDIN stream แทนชื่อไฟล์ คุณสามารถเห็นสิ่งนี้ได้โดยลองกับ echo:
$ echo < <(date)
<blank>
เนื่องจากเสียงก้องไม่ได้อ่าน STDIN และไม่ผ่านการโต้แย้งเราจึงไม่ได้อะไรเลย
ไพพ์และอินพุตเปลี่ยนทิศทางการเลื่อนเนื้อหาไปยังสตรีม STDIN การทดแทนโปรเซสรันคำสั่งบันทึกเอาต์พุตไปยังไฟล์ชั่วคราวพิเศษจากนั้นส่งชื่อไฟล์นั้นแทนคำสั่ง คำสั่งใดก็ตามที่คุณใช้จะถือว่าเป็นชื่อไฟล์ โปรดทราบว่าไฟล์ที่สร้างไม่ได้เป็นไฟล์ปกติ แต่ไปป์ที่มีชื่อที่จะถูกลบโดยอัตโนมัติเมื่อมันไม่จำเป็นอีกต่อไป