Pipelines ou Canalizadores, parte 3: Piping (Canalizando)

O que vamos fazer aqui é, basicamente, pegar as saídas de um lugar e levar para as entradas de outros lugares.
Vamos fazer os comandos se comunicarem, e com isso faremos coisas mais úteis.

O caractere do pipe é o '|'. O pipe pega a saída do comando da esquerda e joga na entrada do comando da direita.
Exemplo:
cat bin.txt | wc

Sabemos que a saída do 'cat bin.txt' é mostrar na tela o conteúdo de tal arquivo (você também pode usar 'more' ou 'less' no lugar de 'more').
Porém, ao invés da saída ir para tela, ela vai pro 'wc' .
Ou seja, nós canalizamos a saída de um comando pra entrada de outro.

Por exemplo, se usar usar Debian e Debian derivadas, baixe o spell (sudo apt-get install spell).
É um antigo dicionário, usado na época do Unix. Você passa pra ele uma lista de palavras, e ele retorna aquelas que não fazem parte do inglês.

Vamos fazer um script que detecte palavras escritas erradas, mas que não mostre as duplicadas adjacentes e as exiba em ordem alfabética.

Não existe um comando que faça tudo isso. Mas vamos pensar como o Unix: existe um comando que coloca as linhas em ordem alfabética - sort -,
outro que tira as duplicadas adjacentes - uniq - e o spell, pra checar as palavras escritas erradas.
A utilidade do pipeline é deixar esses comandos interagirem, em vez de termos que escrever vários comandos, com várias saídas e entradas. Veja:
spell bin.txt | sort | uniq > palavras_nao_reconhecidas.txt

Chequei os erros, joguei o resultado para ser ordenado, e o resultado disso mandei para ser checado a existência de linhas duplicadas.
Ao término de tudo, salvei essa informação em um arquiv de texto.

Esse foi apenas um simples exemplo. Não existem limites pro tanto de comandos e nem você é preso aos comandos do sistema, podendo fazer os seus
scripts tomarem parte nessa canalização.


- Piping em scripts Shell

Lembrando que o shell tem input por meio de teclado, através do comando 'read', que lê o que o usuário digita e guarda numa variável.
Bom, se tem input, pode ser redirecionado! Tenha essa flexibilidade sempre em mente.

Crie o shell script pipe.sh:
#!/bin/sh
echo "Digite um numero: "
read NUM
echo "O numero digitado foi $NUM"

Dê permissão para a execução: chmod +x pipe.sh
Execute com: echo 10 | ./pipe.sh

Ou seja, canalizamos a saída do 'echo' pra entrada do seu script.


- tee : enviando a saída para mais de um arquivo

Muitas vezes, além de enviar a saída para um arquivo de texto, também queremos ver seu resultado na tela ou queremos um registro de tudo que
ocorreu em nosso terminal, sem afetar seu uso.

O comando 'tee' tem o seguinte modelo:
comando | tee arquivo1 | tee arquivo2 | tee ... | comando_que_vai_na_tela

Exemplo:
ls /usr/bin | tee bin.txt | tee bin_backup.txt | wc

Assim, faremos duas cópias da lista de arquivos da pasta de executáveis, ao passo que exibe na tela do terminal um outro comando de seu interesse,
no caso o 'wc'.

Nenhum comentário:

Veja também: