All'inizio sono stato sorpreso. Tuttavia, dopo aver letto le risposte e fatto una piccola indagine, sembra semplice. Quindi ecco quello che ho trovato. (alla fine non c'è stata sorpresa.)
Prima del reindirizzamento stdin, stdout e stderr sono come previsto connessi allo stesso dispositivo.
#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
Pertanto, dopo la maggior parte delle direzioni secondarie (ovvero se stderr) non viene reindirizzato. stderr è ancora collegato al terminale. Pertanto può essere letto per ottenere l'input da tastiera.
L'unica cosa che sta fermando i file utilizzati nella direzione inaspettata è la convenzione, e le pipe sono unidirezionali.
Un altro esempio, prova:
cat | less
Questo va storto dopo una pagina, quando less
tenta di leggere il terminale (questa non è una sorpresa, come cat
sta leggendo anche il terminale).
/dev/tty
è più misterioso, non è un collegamento in /proc/self
.
#ctrl-alt-delor:~$
#↳ ll /dev/tty
crw-rw-rw- 1 root tty 5, 0 Jun 29 09:18 /dev/tty
Vedi quali sono le relazioni tra il mio attuale terminale di controllo e `/ dev / tty`? per una spiegazione. Grazie a @StephenKitt per il link.
/dev/tty
, vedi questa domanda .