Como (e por que) usar o stderr para ler e escrever?

10

De acordo com esta resposta por schily , less lê os comandos de navegação do stderr se não for possível abrir /dev/tty .

Isso parece intrigante, uma vez que nunca vi nada gravar no stream stderr de outro programa, e não sei como eu faria isso.

Qual é o propósito do stderr estar aberto tanto para leitura quanto para escrita? E se isso for útil, como faço para utilizá-lo em sistemas modernos? (Existe alguma sintaxe arcana para canalizar alguma coisa para stderr em vez de stdin, por exemplo?)

    
por Draconis 30.06.2018 / 19:22

2 respostas

8

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.

    
por 30.06.2018 / 20:32
7

Quando você efetua login, stdin, stdout e stderr são conectados ao terminal de onde você faz o login. Para ser mais exato, o tty é normalmente aberto e stdout e stderr são o resultado de duas operações de dup(2) no primeiro. descritor de arquivo. Isto permite ler a partir de stderr, a fim de obter a entrada do termnal.

Como mencionado na outra resposta, os programas são lidos no stderr para obter uma resposta interativa sobre uma questão.

Como um usuário não pode saber sob quais circunstâncias um programa lê de stderr, é uma tentativa inútil de gravar intencionalmente dados em stderr de outro programa.

Observe que os programas atuais geralmente tentam primeiro abrir /dev/tty e usar stderr somente no caso de não funcionar.

Programas que apenas lêem de stderr geralmente nunca foram modificados desde antes de 1979 e tais programas geralmente contêm construções como:

int i 1;

ou

i =* 2;

que não são aceitos pelos compiladores C modernos. Como resultado, é muito improvável que você hoje encontre um programa que nunca abra /dev/tty , mas leia respostas interativas do stderr.

    
por 30.06.2018 / 19:44

Tags