Eu fiquei surpreso no começo. No entanto, depois de ler as respostas e fazer uma pequena investigação, parece simples. Então aqui está o que eu encontrei. (no final não houve surpresa.)
Antes do redirecionamento, stdin, stdout e stderr são os esperados conectados ao mesmo 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
Portanto, após a maioria das re-indicações (isto é, se stderr) não for redirecionado. stderr ainda está conectado ao terminal. Por isso, pode ser lido, para obter a entrada do teclado.
A única coisa que está parando os arquivos sendo usados na direção inesperada é a convenção, e os canais são unidirecionais.
Outro exemplo, tente:
cat | less
Isso dá errado após uma página, quando less
tenta ler o terminal (isso não é uma surpresa, pois cat
também está lendo o terminal).
/dev/tty
é mais misterioso, não é um link para /proc/self
.
#ctrl-alt-delor:~$
#↳ ll /dev/tty
crw-rw-rw- 1 root tty 5, 0 Jun 29 09:18 /dev/tty
Veja que relações existem entre meu terminal de controle atual e '/ dev / tty'? para uma explicação. Obrigado ao @StephenKitt pelo link.