Me sorprendió al principio. Sin embargo, después de leer las respuestas e investigar un poco, parece simple. Así que aquí está lo que he encontrado. (Al final no hubo sorpresa).
Antes de la redirección, stdin, stdout y stderr están conectados según lo esperado al mismo 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
Por lo tanto, después de la mayoría de las redirecciones (es decir, si stderr) no se redirige. stderr todavía está conectado a la terminal. Por lo tanto, se puede leer para obtener la entrada del teclado.
Lo único que detiene los archivos que se usan en la dirección inesperada es la convención, y las tuberías son unidireccionales.
Otro ejemplo, prueba:
cat | less
Esto sale mal después de una página, cuando less
intenta leer el terminal (esto no es una sorpresa, ya cat
que también está leyendo el terminal).
/dev/tty
Es más misterioso, no es un enlace /proc/self
.
#ctrl-alt-delor:~$
#↳ ll /dev/tty
crw-rw-rw- 1 root tty 5, 0 Jun 29 09:18 /dev/tty
¿ Ve qué relaciones hay entre mi terminal de control actual y `/ dev / tty`? por una explenation. Gracias a @StephenKitt por el enlace.
/dev/tty
, vea esta pregunta .