quinta-feira, 29 de julho de 2010

Redirecionamento de E/S

Programas que exigem interação com o usuário funcionam como uma espécie de diálogo entre usuário e computador. Todo usuário precisa comunicar-se de alguma forma, sendo o teclado o meio de expressão. Um diálogo seria uma conversação entre duas ou mais pessoas, logo o computador precisa participar da conversa e para tanto utiliza o monitor. Por trás de todo este aparato existem diferentes canais de comunicação, um para o usuário (chamado de standard input e abreviado como STDIN) e outros dois para a máquina (chamados de standard output e standard error, respectivamente abreviados como STDOUT e STDERR). Por diferentes razões, em algum momento poderá surgir a necessidade de "desviar" um canal para uma fonte ou destino diferente. E é este o tópico a ser abordado neste post.

Caso seja preciso desviar o canal do usuário (STDIN) para obter entradas, utiliza-se o operador '<' seguido da identificação de algum arquivo. Parece difícil imaginar alguma situação em que isto ocorra, mas imagine um programa em teste que exige diversas entradas no decorrer de sua execução. Agora imagine o programador pacientemente dando entradas, testando o software, dando entradas, testando software e assim infinitamente. Cansativo, não? A situação poderia ser resolvida se o programador criasse um arquivo contendo todas as entradas de teste e utilizasse o operador de redirecionamento citado.

Antes de falarmos sobre como desviar os outros canais, é melhor esclarecer a diferença entre eles. STDOUT seria o meio de comunicação principal do programa, ou seja, por onde ele envia a informação a ser exibida na tela do monitor. Por último, mas não menos importante, temos o STDERR, o canal por onde o computador envia as mensagens de erros geradas durante execução.

Existem dois operadores que denotam o redirecionamento de saída, são eles '>' e '>>'. O primeiro redireciona, criando um arquivo contendo a saída ou, caso o arquivo já exista, sobrescrevendo. Já o segundo redireciona, criando um arquivo contendo a saída ou, caso o arquivo já exista, adicionando dados ao final (Append em termos da computação). Como os operadores são os mesmos para ambos canais, criou-se a convenção onde STDOUT seria identificado como 1 e STDERR como 2. Logo, unindo o conhecimento que temos sobre operadores de redirecionamento de saída, chegamos nas diferentes sintaxes listadas abaixo:

1) 1>arquivo (redirecionando STDOUT para um arquivo)
2) 1>>arquivo (redirecionando, com Append, STDOUT para um arquivo)
3) 2>arquivo (redirecionando STDERR para um arquivo)
4) 2>>arquivo (redirecionando, com Append, STDERR para um arquivo)
5) &>arquivo (redirecionando STDOUT e STDERR para um arquivo)











Um comentário: