Ich war zuerst überrascht. Nach dem Lesen der Antworten und einer kleinen Untersuchung scheint es jedoch einfach zu sein. Also hier ist was ich gefunden habe. (Am Ende gab es keine Überraschung.)
Vor der Umleitung werden stdin, stdout und stderr erwartungsgemäß mit demselben Gerät verbunden.
#ctrl-alt-delor:~$
#↳ ll /dev/std*
lrwxrwxrwx 1 root root 15 Jun 3 20:58 /dev/stderr -> /proc/self/fd/2
lrwxrwxrwx 1 root root 15 Jun 3 20:58 /dev/stdin -> /proc/self/fd/0
lrwxrwxrwx 1 root root 15 Jun 3 20:58 /dev/stdout -> /proc/self/fd/1
#ctrl-alt-delor:~$
#↳ ll /proc/self/fd/*
lrwx------ 1 richard richard 64 Jun 30 19:14 /proc/self/fd/0 -> /dev/pts/12
lrwx------ 1 richard richard 64 Jun 30 19:14 /proc/self/fd/1 -> /dev/pts/12
lrwx------ 1 richard richard 64 Jun 30 19:14 /proc/self/fd/2 -> /dev/pts/12
Daher wird nach den meisten Umleitungen (dh wenn stderr) nicht umgeleitet. stderr ist weiterhin mit dem Terminal verbunden. Daher kann es gelesen werden, um Tastatureingaben zu erhalten.
Das einzige, was verhindert, dass die Dateien in unerwarteter Richtung verwendet werden, ist die Konvention, und die Pipes sind unidirektional.
Versuchen Sie es mit einem anderen Beispiel:
cat | less
Dies geht nach einer Seite schief, wenn less
versucht wird, das Terminal zu lesen (dies ist keine Überraschung, ebenso wie cat
das Lesen des Terminals).
/dev/tty
ist mysteriöser, es ist keine Verbindung in /proc/self
.
#ctrl-alt-delor:~$
#↳ ll /dev/tty
crw-rw-rw- 1 root tty 5, 0 Jun 29 09:18 /dev/tty
Sehen Sie, welche Beziehungen zwischen meinem aktuellen steuernden Terminal und `/ dev / tty` bestehen? für eine Erklärung. Danke an @StephenKitt für den Link.
/dev/tty
sehen, diese Frage .