Ponieważ jest to cecha powłoki (ksh, skopiowanej przez bash) i tylko powłoki.
/dev/tcp/...
nie są plikami rzeczywistymi, powłoka przechwytuje próby przekierowania do /dev/tcp/...
pliku, a następnie wykonuje socket(...);connect(...)
(nawiązuje połączenie TCP) zamiast open("/dev/tcp/..."...)
(otwiera ten plik) w takim przypadku.
Zauważ, że musi być tak napisane. cat < /dev/./tcp/...
lub ///dev/tcp/...
nie będzie działać, a zamiast tego spróbuje otworzyć te pliki (które w większości systemów nie istnieją i wystąpi błąd).
Kierunek przekierowania również nie ma znaczenia. Czy używasz 3< /dev/tcp/...
lub 3> /dev/tcp/...
lub 3<> /dev/tcp/...
lub nawet 3>> /dev/tcp/...
nie będzie żadnej różnicy, będziesz mógł czytać i pisać do / z tego deskryptora pliku do odbierania / wysyłania danych przez tego gniazda TCP.
Kiedy to zrobisz cat /dev/tcp/...
, to nie działa, ponieważ cat
nie implementuje tej samej specjalnej obsługi, działa open("/dev/tcp/...")
podobnie dla każdego pliku (oprócz -
), działa tylko powłoka (ksh, tylko bash) i tylko dla celu przekierowań.
To cat -
kolejny przykład specjalnie obsługiwanej ścieżki do pliku. Zamiast robić a open("-")
, odczytuje bezpośrednio z deskryptora pliku 0 (stdin). cat
i wiele narzędzi tekstowych to robi, powłoka nie obsługuje przekierowań. Aby odczytać zawartość -
pliku, potrzebujesz cat ./-
lub cat < -
(lub cat - < -
). W systemach, które nie mają /dev/stdin
, bash
zrobi jednak coś podobnego dla przekierowań z tego (wirtualnego) pliku. GNU awk
robi to samo /dev/stdin
, /dev/stdout
, /dev/stderr
nawet na systemach, które mają takie pliki, które mogą powodować pewne niespodzianki na systemach takich jak Linux, gdzie te pliki zachowują się inaczej.
zsh
ma także obsługę gniazd TCP (i strumienia domeny Unix), ale odbywa się to za pomocą wbudowanych ztcp
(i zsocket
), więc jest mniej ograniczone niż podejście ksh / bash. W szczególności może również działać jako serwer, którego ksh / bash nie może zrobić. Jednak wciąż jest znacznie bardziej ograniczony niż to, co można zrobić w prawdziwym języku programowania.