Pipes: o que você precisa saber para começar a usá-los no GNU / Linux

dutos

Uma cano ou pipe é na verdade um pipeline disponível para UNIX / Linux e muito prático. Mas para entender completamente o que é um pipe, você deve saber que em um ambiente * nix ele tem 3 fluxos de dados integrados. Isso, para quem não sabe, significa que os dados podem viajar de ou para três pontos.

Então você vai entender isso de uma maneira melhor, mas o que quero deixar claro para você agora é que, com um pipeline, o que você pode fazer é canalizar de um desses pontos para outros. Isso permite pegar a saída ou resultado que um programa lança para a entrada de outro para que ele use, etc. Tentarei explicá-lo com alguns exemplos práticos que o ajudarão a entendê-lo muito bem.

Esses pontos que eu estava falando ou fluxos de dados, são:

  • stdin: corresponde a 0 e é a entrada padrão. Geralmente, a entrada padrão para um sistema * nix é o teclado. Ou seja, o que você digitar será a informação utilizada. Ela tem um dispositivo especial associado a ele, que é / dev / stdin.
  • stdout: identificado com 1, é a saída padrão. Normalmente corresponde ao monitor ou tela do seu computador, que é onde você pode ver as informações. Por exemplo, quando você executa um comando ls, a lista de conteúdos é exibida na tela, certo? O dispositivo associado é / dev / stdout.
  • stderr: identificado com 2, é a saída de erro padrão, para quando ocorre um erro em um programa. O dispositivo associado é / dev / stderr.

Com um pipeline, você pode fazer a saída padrão ou saída padrão de um comando passar diretamente para a entrada padrão de outro. Ou seja, você pode fazer um programa alimentar outro. Em vez de usar parâmetros inseridos no teclado, um canal fornece as informações geradas pelo comando anterior por meio desse canal representado pelo |

Com os exemplos você vai entender melhor. Suponha que você queira listar o conteúdo de um diretório, mas está interessado apenas em ver os nomes que correspondem à palavra doc. Portanto, você pode usar um pipeline para canalizar a saída de ls para a entrada do filtro grep para instruí-lo a exibir apenas aqueles que correspondem a esse padrão:

ls -l | grep doc

Então, em vez de mostrar todos os nomes, ele apenas mostra os que realmente te interessam. Você pode fazer o mesmo com o conteúdo de um arquivo. Imagine que você deseja ver apenas as informações dos processos chamados firefox e não todos:

ps aux | grep firefox

Em vez de mostrar toda a saída do programa ps na tela (stdout), o que ele faz é canalizá-la para a entrada do filtro grep e só mostra na saída o que corresponde ao padrão firefox neste caso ...

Se você quiser, você pode usar vários canos para trazer a saída de um comando para a entrada de outro segundo comando e a saída desse segundo para a entrada de um terceiro e assim por diante. Por exemplo:

cat libro | grep love | more

Como você vê, as possibilidades são muitas, tudo o que você pode imaginar e é permitido. Mostre apenas a primeira e a última linha de um arquivo, conte as linhas que entram em wc que vêm da lista e até mesmo classifique-as:

cat listado | head
cat listado | tail
cat listado | wc -l
cat listado | sort

Você também pode trabalhar com erros com | & e, por exemplo, procure a palavra alerta na saída de um script se ele falhar:

./miscript |& grep alerta 

E, finalmente, existem dois comandos intimamente ligados aos tubos que são tee e xargs e que eles podem ampliar ainda mais as possibilidades destes. No caso do tee, o que permitirá é mostrar o resultado do programa anterior na saída padrão para que você possa vê-lo, e além disso, pode canalizá-lo para outro arquivo. Um exemplo seria se você listar o conteúdo de um diretório e quiser ver a saída de ls -l no momento e também salvá-la em um arquivo Listing.txt:

ls -l | tee listado.txt

Se você não usar tee, não será capaz de ver a saída em seu console ...

Y xargs é ainda mais interessante em alguns casos. Nesse caso, ele é capaz de construir um comando a partir da entrada padrão que recebe por meio do pipeline. Em outras palavras, é capaz de capturar tudo o que um programa anterior lançou por meio de sua saída e que chega a xargs por meio do pipeline para passá-lo por sua vez a outro comando como argumentos.

Ainda não entendeu? Você verá isso muito melhor com um exemplo. Imagine que você queira remover todos os malditos arquivos thumbs.db de um diretório, disco ou partição. Se houver muitos, pode ser impossível ir um por um com o comando rm para excluí-los manualmente. Mas com o xargs você pode automatizar tudo. E você pode fazer isso usando find para localizá-los, enviar a saída por meio da entrada de xargs e isso, por sua vez, fornecerá a rm os nomes como argumentos. Portanto, todos os localizados serão excluídos automaticamente:

find ./ -name "thumbs.db" | xargs rm

Por exemplo, suponha que find localize /home/name/thumbs.db, /media/test/thumbs.db e /tmp/thumbs.db. Bem, xargs vai entregá-los à empresa como se fossem argumentos. Isto é, como se tivéssemos executado: rm /home/name/thumbs.db, depois rm /media/test/thumbs.db e então rm /tmp/thumbs.db.


Deixe um comentário

Seu endereço de email não será publicado. Campos obrigatórios são marcados com *

*

*

  1. Responsável pelos dados: AB Internet Networks 2008 SL
  2. Finalidade dos dados: Controle de SPAM, gerenciamento de comentários.
  3. Legitimação: Seu consentimento
  4. Comunicação de dados: Os dados não serão comunicados a terceiros, exceto por obrigação legal.
  5. Armazenamento de dados: banco de dados hospedado pela Occentus Networks (UE)
  6. Direitos: A qualquer momento você pode limitar, recuperar e excluir suas informações.

  1.   Jose dito

    Excelente, esta informação é muito importante para nós, usuários de Linux

  2.   Daniel dito

    Que bom artigo, agora que estou estudando redirecionamento de E / S no livro The Linux Command Line. É mais claro para mim sobre os tubos (Pipeline) e os três fluxos de dados. A contribuição é apreciada. Saudações.

  3.   01101001b dito

    O exemplo com xargs me serviu como uma luva. Mesmo hoje estava lidando com o detalhe de uma saída múltipla que tinha que enviar "em partes". xargs caminhou um pinturita.
    Muito grato!