Pipelines ou Canalizadores, parte 2: Redirecionando Informações

- Redirecionando a saída padrão

Ao invés da saída ser exibida na tela, ela irá para um arquivo:
comando > arquivo_de_saida

Por exemplo, vamos salvar os arquivos da sua pasta de executáveis:
ls /etc/bin > bin.txt

Para ver:
cat bin.txt | more


- Redirecionando a entrada padrão

Ao invés da entrada ser o teclado, ela pode ser um arquivo.

Por exemplo, vamos usar o comando 'wc', que calcula o número de linhas, de palavras e o tamanho em bytes para descobrir a quantidade de comandos que você pode usar no seu sistema:
wc < bin.txt

A resposta é o primeiro elemento.
Nesse caso, o comando 'wc' recebe informações do bin.txt, e não do teclado (quer seria o padrão).


- Redirecionando o erro padrão

A maior utilidade do sistema gerar erros e tratá-los como arquivos é que você pode redirecioná-los.
Por exemplo, enquanto um processo é direcionado com sua saída para um arquivo (de log, por exemplo) o erro pode pode ser direcionado para o terminal. Assim, você vê na tela os erros enquanto o processo está a ocorrer em background.

Para redirecionar o erro, use o file descriptor 2 antes do '>'. Veja:
ls /pasta/inexistente 2> erro.log

Depois veja o conteúdo de erro.log:
cat erro.log

Deve mostrar a mensagem de erro, informando que não existe tal diretório ou arquivo.


- Redirecionando saída e erro padrões

Se você quer direcionar sempre o erro pro mesmo lugar da saída, use :
ls /usr/bin > bin.txt 2>&1

Interprete na ordem. Primeiro o comando passa os dados pra saida, que é o arquivo bin.txt .
Caso surja algum erro, ele é envidado (2>) para '&1' .

E onde é esse &1? '&1' guarda o local da saída, por isso o 1 (lembre-se: stdin 0, stdout 1 e stderr 2), sejá lá onde for (nem sempre sabemos).

Não coloque espaços ao redor de '2>&1'. Escreva tudo junto mesmo, pois o '&' é outro comando.

Um atalho para redirecionar ambos, saída e erro, para um arquivo só, é usar '&>'
ls /diretorio/inexistente &> ambos.log


- Anexando informações

Quando se usa o operador '>' pra saída, devemos tomar muito cuidado, pois se houver um arquivo com o mesmo nome, ele simplesmente substitui, sem aviso prévio.

Se você quiser criar um arquivo de registro (log), o ideal é usar o operador '>>' que anexa, sempre, ao fim do arquivo, as novas informações, e caso o arquivo não exista, ele cria o tal.

Vamos testar com o comando 'uptime', que dentre outras funções, informa a hora atual e há quanto tempo seu computador está ligado:
uptime >> time.log
uptime >> time.log
cat time.log


- Apagando

Pra apagar o conteúdo do arquivo, usa ':>' :
:> bin.txt

Note que ele apagou o conteúdo, mas o bin.txt ainda continua lá.
Muito cuidado pra não digitar o nome errado do arquivo.


- /dev/null : descartando a saída

Muitas vezes não queremos ver o conteúdo de uma saída, como o resultado do ls, queremos ver apenas se ele gera erro, para testar um comando ou testar uma condição em Shell Scripting.
Para tal, redirecione sua saída para '/dev/null' :

ls /usr/bin > /dev/null

Um comentário:

Programação Progressiva disse...

Recebi o importante comentário do usuário leandro, do site Viva o Linux:

Apenas uma ressalva: como é relativamente comum se utilizar o sh como interpretador em shell scripts, vale ressaltar que ele não reconhece o redirecionador &>. Ou seja, o comando:

ls /pasta/inexistente &> ambos.log

Não funcionaria no sh, e portanto, nos scripts que utilizam o cabeçalho #!/bin/sh. Apenas os que utilizam o bash (#!/bin/bash) ou outro interpretador (como o zsh).

Isso porque o sh reconhece o "&>" apenas como "&", que executa o comando em background.