Aula 7.7 - Entenda o processo de redirecionamentos no Linux
Este artigo faz parte do projeto #LTCode
Um programa geralmente possui configurado entradas e saídas padrões.
- Entrada padrão possui código 0 e é onde o programa recebe informações, por padrão do teclado.
- Saída padrão possui código 1 e é onde o programa pode mandar informações, por padrão é enviado para a tela.
- Saída de erro padrão possui código 2 e é onde o programa pode mandar mensagens de erro, por padrão é enviado também para a tela.
Essas entradas e saídas são mapeadas no terminal (tty), a imagem abaixo ilustra o redirecionamento da saída padrão (1) para outra janela do terminal.
O símbolo de redirecionamento de saída padrão é o sinal de maior ">", que instruí a shell a redirecionar a saída, do comando cat por exemplo, para o arquivo especificado ao invés do terminal atual. Portanto o formato para redirecionamento na linha de comando é dado por: $ comando [argumentos] > arquivo
No exemplo com o comando cat acima caso se o arquivo rock.txt, punk.txt ou goodmusic.txt já existisse, a shell iria sobrescrevê-lo apagando seu conteúdo pelo conteúdo a ser redirecionado.
Como evitar sobrescrever um arquivo no terminal Linux? A shell permite você utilizar a funcionalidade noclobber que previne sobrescrever um arquivo usando redirecionamentos. Assim uma mensagem será exibida e o comando não será executado ao tentar sobrescrever o arquivo.
Note que -o habilita o noclobber e +o desabilita (confuso né?). Também é possível forçar para o arquivo ser sobrescrito, basta usar o símbolo >| no lugar do símbolo de redirecionamento > .
Pode acontecer de algumas shell não concatenar como esperado, resultando em resultados inesperados. Uma solução para isso é utilizar o símbolo de anexar na saída ">>" (sem aspas) que faz com que a shell adicione novas informações ao final do arquivo especificado, deixando informações pré-existentes intactas.
Até aqui você aprendeu sobre redirecionamento de saída padrão, mas como realizar o redirecionamento de entrada padrão? É simples, o símbolo de redirecionamento de entrada padrão é o sinal de menor "<" (sem aspas) que instruí a shell a redirecionar a entrada padrão para um comando vindo do arquivo especificado ao invés do teclado. Portando o formato para redirecionamento na linha de comando é dado por: $ comando [argumentos] < arquivo
O comando cat, lpr, grep, sort e outros são similares no fato de que realizar o redirecionamento da entrada tem o mesmo efeito de usar a entrada diretamente como parâmetro. Portanto "cat online.txt" dá o mesmo resultado que "cat < online.txt"
A imagem logo acima ilustra que o comando sort recebe como entrada o arquivo linux.txt para ordenar seu conteúdo. Logo em seguida a saída do comando sort é redirecionada para o arquivo ordenado.txt , resultando em um arquivo com os nomes de algumas distribuições Linux em ordem alfabética.
No Linux existe um dispositivo especial conhecido como /dev/null que é uma espécie de buraco negro (data sink) ou lixeira de bits (bit bucket). Portanto este dispositivo é útil para redirecionar saídas que não deseja manter ou visualizar, fazendo com que os dados desapareçam.
A saída do /dev/null é uma string vazia, então podemos utilizá-la para limpar um arquivo de texto por exemplo, como ilustrado na imagem logo acima.
Utilizando pipes, símbolo especial | (pipe), é possível conectar a saída padrão de um comando na entrada padrão de outro comando. O formato na linha de comando é dado por: $ comandoA [argumentos] | comandoB [argumentos]
Por exemplo no comando da imagem acima, a saída do comando "ps aux" é paginada com o comando "more".
O comando "tee" permite copiar os dados de entrada para um arquivo e para sua saída padrão. Entenda que "df -h" lista o sistema de arquivo de uma forma legível, a saída passa pelo PIPE e o utilitário "tee" recebe ela e redireciona para a entrada de um arquivo, no caso "filesystem.txt" e ao mesmo tempo para uma saída padrão que é redirecionada com o PIPE seguinte para o comando "grep" buscar na entrada linhas que possuem a palavra "tmp".
Além de enviar mensagens para a saída padrão, programas podem enviar mensagens para a saída de erro padrão para evitar misturar as informações de uma saída com a outra. Assim como a saída padrão, por padrão a shell direciona a saída de erro padrão para a tela. A não ser que direcione uma ou a outra, não é possível distinguir qual das duas saídas foi utilizada.
A shell permite selecionar qual descritor de arquivos se deseja redirecionar o fluxo: basta colocar o número do descritor antes do símbolo de redirecionamento. Exemplo:
Note que "arquivo2" não existe, retornando um error.
- Redirecionar saída padrão: 1> (ou apenas: > )
- Redirecionar saída de erro: 2> (ou apenas: > )
Você também pode redirecionar a saída padrão juntamente com a saída de erro, basta utilizar "&>" (sem aspas). Agora para redirecionar a entrada padrão use "<" .
- Redirecionar saída padrão E saída de erro: &>
- Redirecionar entrada padrão: 0< (ou apenas: < )
É possível redirecionar o fluxo de um descritor para outro. Confira:
Usando n>&m , onde n é o descritor de onde vem vem o fluxo e m para onde vai, foi possível alterar o fluxo da saída de erro padrão (2>) para o mesmo local da saída padrão (&1). Assim também é possível criar um script que possa enviar mensagens para a saída de erro padrão, basta redirecionar o echo da mensagem 1>&2 .
Outra forma de prover dados de entrada é através de documentos HERE. Ao invés de ler de um arquivo com o operador de entrada padrão, pode-se ler diretamente da entrada até encontrar um delimitador especificado pelo usuário. O delimitador especificado pelo usuário pode ser qualquer palavra sempre após << . Para remover tabulações basta usar <<- e o nome do delimitador.
Mais símbolos:
- <&m Duplica entrada padrão de descritor de arquivo m.
- n>>&m Similar ao operador n>&m , mas concatena ao invés de sobrescrever.
- n<&- Fecha a entrada padrão ou o descritor de arquivo n se especificado.
- n>&- Fecha a saída padrão ou o descritor de arquivo n se especificado.
Próxima aula, clique aqui.
COMENTÁRIOS