Denn das ist ein Merkmal der Shell (von ksh, kopiert von bash) und nur der Shell.
/dev/tcp/...
Wenn es sich nicht um echte Dateien handelt, fängt die Shell die Versuche ab, zu einer /dev/tcp/...
Datei umzuleiten, und führt dann in diesem Fall eine socket(...);connect(...)
(stellt eine TCP-Verbindung her) anstelle einer open("/dev/tcp/..."...)
(Öffnen dieser Datei) aus.
Beachten Sie, dass es so geschrieben werden muss. cat < /dev/./tcp/...
oder ///dev/tcp/...
funktioniert nicht und versucht stattdessen, diese Dateien zu öffnen (was auf den meisten Systemen nicht vorhanden ist und Ihnen eine Fehlermeldung angezeigt wird).
Die Richtung der Umleitung spielt ebenfalls keine Rolle. Egal , ob Sie 3< /dev/tcp/...
oder 3> /dev/tcp/...
oder 3<> /dev/tcp/...
oder gar 3>> /dev/tcp/...
keinen Unterschied machen, werden Sie zum Lesen und Schreiben von / auf diese Dateideskriptor der Lage sein , zu empfangen / Sendedaten über diesen TCP - Socket.
Wenn Sie dies tun cat /dev/tcp/...
, funktioniert dies nicht, da cat
nicht dieselbe spezielle Behandlung implementiert wird. Dies gilt open("/dev/tcp/...")
für jede Datei (außer -
), nur für die Shell (nur ksh, bash) und nur für das Ziel von Umleitungen.
Dies cat -
ist ein weiteres Beispiel für einen speziell behandelten Dateipfad. Anstelle von a open("-")
liest es direkt aus dem Dateideskriptor 0 (stdin). cat
Und viele Text-Dienstprogramme tun dies, die Shell sorgt nicht für ihre Weiterleitungen. Zum Lesen des Inhalts der -
Datei benötigen Sie cat ./-
oder cat < -
(oder cat - < -
). Auf Systemen, die keine haben /dev/stdin
, bash
wird jedoch etwas Ähnliches für Umleitungen von dieser (virtuellen) Datei tun. GNU awk
macht das gleiche für /dev/stdin
, /dev/stdout
, /dev/stderr
auch auf Systeme , die solche Dateien zu tun haben , das einige Überraschungen auf Systeme wie Linux verursachen kann , wo diese Dateien anders verhalten.
zsh
Unterstützt auch TCP- Sockets (und Unix-Domain-Streams), dies geschieht jedoch mit ztcp
(und zsocket
) eingebauten Sockets, sodass es weniger eingeschränkt ist als der ksh / bash-Ansatz. Insbesondere kann es auch als Server fungieren, was ksh / bash nicht kann. Es ist jedoch immer noch viel begrenzter als das, was Sie in einer echten Programmiersprache tun können.