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 estão, conforme o esperado, 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 reorientações (isto é, se stderr) não é redirecionado. O stderr ainda está conectado ao terminal. Portanto, pode ser lido, para obter a entrada do teclado.
A única coisa que interrompe os arquivos que estão sendo usados na direção inesperada é a convenção e os tubos 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, como 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 quais são as relações entre o meu terminal de controle atual e o `/ dev / tty`? para uma explicação. Obrigado a @StephenKitt pelo link.
/dev/tty
, veja esta pergunta .