Bởi vì đó là một tính năng của shell (của ksh, được sao chép bằng bash) và chỉ vỏ.
/dev/tcp/...
không phải là tệp thực, trình bao chặn các nỗ lực chuyển hướng đến /dev/tcp/...
tệp và sau đó thực hiện socket(...);connect(...)
(tạo kết nối TCP) thay vì open("/dev/tcp/..."...)
(mở tệp đó) trong trường hợp đó.
Lưu ý rằng nó phải được đánh vần như vậy. cat < /dev/./tcp/...
hoặc là///dev/tcp/...
sẽ không hoạt động và thay vào đó sẽ cố gắng mở các tệp đó (mà trên hầu hết các hệ thống không tồn tại và bạn sẽ gặp lỗi).
Hướng chuyển hướng cũng không thành vấn đề. Cho dù bạn sử dụng 3< /dev/tcp/...
hoặc 3> /dev/tcp/...
hoặc 3<> /dev/tcp/...
hoặc thậm chí 3>> /dev/tcp/...
sẽ không thực hiện bất kỳ sự khác biệt, bạn sẽ có thể để cả đọc và viết từ / đến đó mô tả tập tin để nhận / gửi dữ liệu qua rằng socket TCP.
Khi bạn làm như vậy cat /dev/tcp/...
, điều đó không hoạt động vì cat
không thực hiện cùng một cách xử lý đặc biệt đó, nó sẽ open("/dev/tcp/...")
giống như mọi tệp (ngoại trừ-
), chỉ có vỏ (chỉ ksh, bash) và chỉ cho mục tiêu chuyển hướng.
Đó cat -
là một ví dụ khác về đường dẫn tệp được xử lý đặc biệt. Thay vì làm a open("-")
, nó đọc trực tiếp từ bộ mô tả tệp 0 (stdin). cat
và nhiều tiện ích văn bản làm điều đó, shell không cho chuyển hướng của nó. Để đọc nội dung của -
tệp, bạn cần cat ./-
hoặc cat < -
(hoặc cat - < -
). Tuy nhiên /dev/stdin
, trên các hệ thống không có , bash
sẽ thực hiện một số thứ tương tự để chuyển hướng từ tệp (ảo) đó. GNU awk
cũng làm như vậy cho /dev/stdin
, /dev/stdout
, /dev/stderr
ngay cả trên hệ thống mà không có tập tin như vậy có thể gây ra một số bất ngờ trên các hệ thống như Linux nơi các tập tin hành xử khác nhau.
zsh
cũng có hỗ trợ ổ cắm TCP (và luồng tên miền Unix), nhưng điều đó được thực hiện với một ztcp
(và zsocket
) nội dung, do đó, nó ít bị giới hạn hơn so với phương pháp ksh / bash. Đặc biệt, nó cũng có thể hoạt động như một máy chủ mà ksh / bash không thể làm được. Nó vẫn còn hạn chế hơn nhiều so với những gì bạn có thể làm trong một ngôn ngữ lập trình thực sự.