[ UNIX ] 

Entrada e Saída Padrão do UNIX  



Data do Documento: 05/01/2000 
Ultima atualização: 05/01/2000 
Palavras Chave: unix, entrada padrão, saída padrão, redirecionador 
Autor: Verdade @bsoluta 
Tradutor
Arquivo: entra_sai_unix.htm 
Status: completo 

Comentários e correções são sempre bem-vindos.


As entradas e saídas padrões do UNIX são definidas através dos descritores padrões. 
 
Descritor Definição Dispositivo
0 entrada padrão teclado
1 saída padrão de mensagens normais terminal
2 saída padrão de erros terminal
* O UNIX possui outros descritores de arquivos. 

O UNIX garante que os processos sempre tenham os descritores de arquivos abertos para leitura e gravação, desta forma ao emitir-mos um comando o UNIX assume a entrada padão como sendo o teclado e a saída padão como sendo o terminal (vídeo): 

% ls -alp 
    total 4 
    drwxrwxr-x    2    frank    512    Jan    03    02:45    . 
    drwxrwxr-x    2    frank    512    Jan    03    02:25    .. 
    -rw-r--r--       2    frank   1102    Jan    03    03:35    verifica.sh * 
    drwxrwxr-x    3    frank    512    Jan    03    03:50    temp / 
    drwxrwxr-x    3    frank    512    Jan    03    03:55    IDS / 
    -rwxrwxr-x    2     frank   2120   Jan    03    02:50    mail.sh 

O Comando "ls -alp" é  recebido na entrada padão (0) associada ao teclado e o resultado é impresso na saída padrão de mensagens normais (1) associado ao terminal (vídeo). 

A saída de erro também esta associada ao terminal, desta forma pode surgir a seguinte questão: Se tanto a saída padão de mensagens normais como a saída padão de erro estão associadas ao terminal, por que existe um descritor de saída de erro? 

A resposta é muito simples, o UNIX permite que você mude as saídas padões e desta forma possa por exemplo separar as mensagens normais das mensagens de erro, isso pode ser muito util em situações de depuração de programas ou mesmo em atividades rotineiras. 

No exemplo abaixo vamos compilar um programa com alguns erros: 

% gcc tcplog.c -o tcplog 
tcplog.c: In function 'int main(...)': 
tcplog.c:105: warning: implicit declaration of function 'int inet_addr(..)' 
tcplog.c:110: warning: implicit declaration of function 'int inet_usleep(..)' 
... 

Os erros podem ser muitos tornando difícil a análise e você gostaria de envia-los por email para seu grupo de pesquisa a fim de que possam ajudar na depuração do programa ou mesmo grava-los em um arquivo para análise futura. 

Isso pode ser feito mudando-se a saída padrão de erro: 

% gcc tcplog.c -o tcplog 2> tcplog.erro 

Usando o descritor dois (2) que identifica a saída padrão de erro enviamos os erros para um arquivo (tcplog.erro). 

%more tcplog.erro 
tcplog.c: In function 'int main(...)': 
tcplog.c:105: warning: implicit declaration of function 'int inet_addr(..)' 
tcplog.c:110: warning: implicit declaration of function 'int inet_usleep(..)' 
... 

Na verdade, um descritor  pode ser redirecionado usando-se  m>,  onde  m  é um número da tabela de descritores. 

Podemos usar formas mais extensas como: 

% comando 1>normal.log 2>erro.log 

Isso faz com que o resultado da saída padrão de mensagens normais seja redirecionada para o arquivo normal.log e os erros para o arquivo erro.log. 

O comando: 

% comando  > log   2> log 

informa ao shell para redirecionar as mensagens normais e de erro para o arquivo log, uma forma mais extensa e reescrever o mesmo comando como: 

% comando  1> log  2>log 

o resulta é o mesmo. 

Mas como você é um pessoa inteligente e por isso usa UNIX :) exitem formas mais interessantes de obter o mesmo resultado: 

% comando > log  2>&1 

Esta construção,  2>&1,  quer dizer: o descritor padrão de erro (2) deve ser associado (>&) ao mesmo arquivo que está ligado ao descritor da saída padrão de mensagens normais (1). 

Você pode querer desprezar as saídas de erro, isso pode ser feito enviando-se as mesmas para o arquivo especial do UNIX   /dev/null,  este arquivo consomem as mensagens que lhe são enviadas sem ocupar espaço em disco, este arquivo também é conhecido como burraco negro. 

Vejamos uma aplicação deste recurso. 

Se você for um usuário "mortal", provavelmente exite uma série de diretórios ao qual não possui acesso, ao executar o comando  "find" apartir da raiz  "/" você vai obter algumas mensagens de erros, vajamos: 

% find / -name core -print 
find: /var/log/squid: Permission denied 
find: /var/log/at: Permission denied 
find: /var/log/cron: Permission denied 
/proc/sys/net/core 
find: /proc/1/fd: Permission denied 
find: /proc/2/fd: Permission denied 
find: /proc/3/fd: Permission denied 
find: /proc/4/fd: Permission denied 
/home/frank/core 
/home/frank/misc/core 
find: /usr/local/seg/saint-1.4.1/bin: Permission denied 
find: /usr/local/seg/saint-1.4.1/config: Permission denied 
find: /usr/local/seg/saint-1.4.1/include: Permission denied 
find: /usr/local/seg/saint-1.4.1/perl: Permission denied 
/usr/src/linux-2.2.5/net/core/ 

Uma forma de obter a listagem somento dos arquivos ao qual possui acesso é enviar os erros para o burraco negro (/dev/null): 

% find / -name core 2> /dev/null 
/proc/sys/net/core 
/home/frank/core 
/home/frank/misc/core 
/usr/src/linux-2.2.5/net/core/ 

 

Referência : 

  • Aumentando Produtividade e Qualidade em Sistemas Abertos - Guia Avançado para Ambientes UNIX
  • The Design of the UNIX Operating System (ISBN - 0-13-201799-7)

<=

http://www.absoluta.org      ---oOo---      verdade@absoluta.org

Copyright © 1998 - 2000  Verdade @bsoluta