paulo1205
(usa Ubuntu)
Enviado em 06/10/2016 - 16:28h
stderr é um stream associado ao local que recebe as mensagens de erro.
Tipicamente, quando você faz login num terminal linux ou no console do Windows, a saída de mensagens de erro vai para o próprio terminal, bem como a saída de mensagens normais.
O C define três streams padrão:
Stream | Buffer | Função | Associado por padrão a
-------+--------+------------------------------+------------------------
stdin | Linha | Padrão para entrada de dados | Terminal (teclado)
stdout | Linha | Padrão para saída de dados | Terminal (tela)
stderr | Não | Padrão para saída de erros | Terminal (tela)
Um stream com buffer orientado a linha significa que as funções de leitura ou escrita aguardam o fim da linha (presença do caráter '\n') antes de completar a operação de modo visível. Por exemplo: se você chamar “
printf("Teste")”, o texto “Teste” possivelmente não será impresso imediatamente, mas ficará retido num buffer até que uma operação de escrita subsequente inclua uma quebra de linha. Por outro lado, um stream não bufferizado implica que qualquer operação será imediatamente repassada para uma operação de saída real do sistema, sem aguardar quebras de linha nem qualquer outra situação.
Faz sentido para mim que uma mensagem de erro não fique aguardando para ser enviada ao usuário.
Operações de escrita que não especificam destino são funcionalmente equivalentes a operações realizadas sobre
stdout. Por exemplo:
Esta operação... | ... é funcionalmente equivalente a esta(s)
--------------------------+----------------------------------------------
printf("Valor=%d\n", n); | fprintf(stdout, "Valor=%d\n", n);
putchar('\n'); | fputc('\n', stdout);
puts("Linha"); | fputs("Linha", stdout); fputc('\n', stdout);
De modo análogo, operações de leitura que não pedem stream implicam que a leitura é feita a partir de
stdin.
Esta operação... | ... é funcionalmente equivalente a esta
--------------------------------+-----------------------------------------
scanf("%f", &x); | fscanf(stdin, "%f", &x);
int ch=getchar(); | int ch=fgetc(stdin);
(gets() removido do C em 2011) | fgets(linha, tamanho_linha, stdin);
O fato de mensagens comuns e mensagens de erro terem destinos diferentes é útil, sobretudo em casos de redirecionamento. Por exemplo, a linha abaixo descarta as mensagens de erro, redirecionando-as para /dev/null, que podem advir de haver diretórios no meio de uma lista de nomes de arquivos passadas ao comando
grep.
grep -l Fulano /etc/* 2>/dev/null >/tmp/arquivo_de_saida.txt
Às vezes você pode querer redirecionar a saída de erros para um lugar útil. O exemplo abaixo mostra três redircionamentos: da entrada padrão, a partir de um arquivo de logs, da saída de erros, para um arquivo de mensagens de erro, e da saída padrão, para um pipe que executa o comando
sort.
processa_logs < /var/log/secure 2>/home/fulano/erros.txt | sort