เพราะนั่นเป็นคุณสมบัติของเชลล์ (ของ ksh, คัดลอกโดย bash) และเชลล์เท่านั้น
/dev/tcp/...
ไม่ใช่ไฟล์จริงเชลล์สกัดกั้นความพยายามในการเปลี่ยนเส้นทางไปยัง/dev/tcp/...
ไฟล์จากนั้นทำการsocket(...);connect(...)
(ทำการเชื่อมต่อ TCP) แทนการopen("/dev/tcp/..."...)
(เปิดไฟล์นั้น) ในกรณีนั้น
โปรดทราบว่าจะต้องมีการสะกดเช่นนั้น cat < /dev/./tcp/...
หรือ///dev/tcp/...
ไม่ทำงานและจะพยายามเปิดไฟล์เหล่านั้นแทน (ซึ่งในระบบส่วนใหญ่ไม่มีอยู่และคุณจะได้รับข้อผิดพลาด)
ทิศทางของการเปลี่ยนเส้นทางก็ไม่สำคัญเช่นกัน ไม่ว่าคุณจะใช้3< /dev/tcp/...
หรือ3> /dev/tcp/...
หรือ3<> /dev/tcp/...
หรือ3>> /dev/tcp/...
จะไม่สร้างความแตกต่างใด ๆ ก็ตามคุณจะสามารถอ่านและเขียนจาก / ถึงตัวอธิบายไฟล์นั้นเพื่อรับ / ส่งข้อมูลผ่านซ็อกเก็ต TCP นั้น
เมื่อคุณทำเช่นcat /dev/tcp/...
นั้นจะไม่ทำงานเพราะcat
ไม่ได้ใช้การจัดการพิเศษแบบเดียวกันมันไม่open("/dev/tcp/...")
เหมือนกับไฟล์ทุกไฟล์ (ยกเว้น-
) เฉพาะเชลล์ (ksh, bash เท่านั้น) เท่านั้นและสำหรับเป้าหมายของการเปลี่ยนเส้นทางเท่านั้น
นั่นcat -
เป็นอีกตัวอย่างหนึ่งของพา ธ ไฟล์ที่จัดการเป็นพิเศษ แทนที่จะopen("-")
อ่านa จะอ่านโดยตรงจาก file descriptor 0 (stdin) cat
และยูทิลิตี้ข้อความจำนวนมากทำเช่นนั้นเชลล์ไม่ได้ใช้เปลี่ยนเส้นทาง หากต้องการอ่านเนื้อหาของ-
ไฟล์คุณต้องcat ./-
หรือcat < -
(หรือcat - < -
) ในระบบที่ไม่ได้มี/dev/stdin
, bash
แต่จะทำบางสิ่งบางอย่างที่คล้ายกันสำหรับการเปลี่ยนเส้นทางจากที่ (เสมือน) ไฟล์ GNU awk
ไม่เหมือนกันสำหรับ/dev/stdin
, /dev/stdout
, /dev/stderr
แม้ในระบบที่มีไฟล์ดังกล่าวซึ่งอาจทำให้เกิดความผิดบางประการเกี่ยวกับระบบเช่นลินุกซ์ที่ไฟล์เหล่านั้นทำงานแตกต่างกัน
zsh
นอกจากนี้ยังมีการรองรับซ็อกเก็ต TCP (และโดเมน Unix) แต่ก็ทำด้วยztcp
(และzsocket
) builtins ดังนั้นจึงมีข้อ จำกัด น้อยกว่าวิธี ksh / bash โดยเฉพาะอย่างยิ่งมันสามารถทำหน้าที่เป็นเซิร์ฟเวอร์ที่ ksh / bash ไม่สามารถทำได้ มันยังมีข้อ จำกัด มากกว่าสิ่งที่คุณสามารถทำได้ในภาษาการเขียนโปรแกรมจริง