Your Web News in One Place

Help Webnuz

Referal links:

Sign up for GreenGeeks web hosting
June 15, 2022 03:35 am GMT

Entendendo UNIX pipes

Basicamente, a todo comando UNIX atribudo um conjunto de streams, que so canais de comunicao. Ou seja, um comando pode enviar dados para uma stream de sada (STDOUT), ler dados de uma stream de entrada (STDIN) e escrever dados em uma stream de falhas/erros (STDERR).

Cada stream representada por um nmero inteiro atravs de file descriptors:

  • 0: stream de entrada
  • 1: stream de sada
  • 2: stream de erros

UNIX e comunicao de processos

Por padro, processos no sistema operacional so isolados. Mas para uso real, um processo precisa se comunicar com outros atravs do envio de mensagens.

Os streams de comunicao so, portanto, uma forma de comunicao entre processos, tambm chamada de Inter-Process communication, ou IPC.

Redirecionamento do STDOUT

Quando executamos comandos UNIX, a stream padro de sada o prprio screen, ou STDOUT.

$ echo 'Ol!'
Ol!

Isto mostra no screen a palavra Ol. Mas podemos redirecionar o output para um arquivo parte para ser consultado depois. Este redirecionamento deve ser feito com os sinais > (para stdout e stderr) ou < (para stdin).

Em cada sinal deve ser prefixado o nmero do file descriptor correspondente.

# o stdout 1 est sendo redirecionado para out.log$ echo 'Ol!' 1> out.log ### DICA BNUS# Se omitirmos o nmero do file descriptor, por padro o UNIX# entende que  o STDOUT!!!!1$ echo 'Ol!' > out.log 

Com redirecionamento, o sistema "muda" o comportamento padro do stream. Neste caso, no vemos mais a palavra sendo enviada para o screen. Precisamos ento consultar o arquivo:

$ cat out.log
Ol!

Redirecionamento do STDIN

Vamos imaginar um cenrio onde queremos gerar hash de um contedo utilizando md5.

O comando md5 recebe um arquivo como input. Como o STDIN por padro l do screen (e fica a espera de dados a partir do teclado), podemos redirecionar o STDIN (0) tal como fizemos com o STDOUT (1), de forma que o input seja lido a partir de um arquivo, e no do teclado:

$ echo 'my precious' > rawcontent.txt # redireciona stdout 1$ md5 0< rawcontent.txt               # redireciona stdin 0
2a5f942537474f69e4bca57711ae6ff2

E o STDERR?

Assim como fazemos para o STDOUT com o sinal >, podemos redirecionar o STDERR (erros ocorridos durante o comando) para outro lugar:

$ md5 rawcontent.txt 2> md5err.log

Nesse caso, como o comando no lana nenhum erro, o arquivo md5err.log est vazio e o output foi enviado para o STDOUT.

$ md5 filenotfound 2> md5err.log$ cat md5err.log
md5: filenotfound: No such file or directory

Inclusive podemos fazer redirecionamento de todas as sadas no mesmo comando:

$ md5 rawcontent.txt > md5out.log 2> md5err.log

Ou ento, fazer com que o STDERR seja redirecionado para o STDOUT:

$ md5 rawcontent.txt > md5out.log 2>&1

UNIX pipelines

E se quisermos continuar criando uma "pipeline" de transformao dos dados, de forma que ao fim do md5, queremos transformar o contedo em base64?

Podemos continuar redirecionando "outs e ins" quantas vezes quisermos em mltiplos comandos:

$ echo 'my precious' > rawcontent.txt$ md5 0< rawcontent.txt > md5content.txt$ base64 0< md5content.txt
MmE1Zjk0MjUzNzQ3NGY2OWU0YmNhNTc3MTFhZTZmZjIK

Mas esta cadeia de mltiplos comandos ficaria ilegvel e difcil de manter. Sem contar que tantos aquivos de redirecionamento vo ficar ocupando espao de armazenamento o que nos obrigaria a ter uma rotina para apagar tais arquivos.

Podemos recorrer aos pipes annimos |, ou unnamed pipes, que basicamente redirecionam o stdout de um comando para o stdin do outro comando na sequncia.

E diferente dos arquivos de redirecionamento, os pipes annimos funcionam como file descriptor "temporrios" que so apagados ao trmino do comando.

$ echo 'my precious' | md5 | base64
MmE1Zjk0MjUzNzQ3NGY2OWU0YmNhNTc3MTFhZTZmZjIK

Lindo, no ?

Concluso

Neste artigo, tentei demonstrar o funcionamento bsico de UNIX pipelines, que utilizam pipes annimos para que diferentes processos possam comunicar entre si.

Este artigo do Marcell Cruz bastante elucidativo e me ajudou a despertar interesse em dissecar o tema para produzir mais contedo de UNIX em pt-BR.

No artigo a seguir mostro como funcionam UNIX named pipes e como isto abre portas para a implementao de um simples background job em Shell script.

Stay tuned!


Original Link: https://dev.to/leandronsp/entendendo-unix-pipes-3k56

Share this article:    Share on Facebook
View Full Article

Dev To

An online community for sharing and discovering great ideas, having debates, and making friends

More About this Source Visit Dev To