An Interest In:
Web News this Week
- April 23, 2024
- April 22, 2024
- April 21, 2024
- April 20, 2024
- April 19, 2024
- April 18, 2024
- April 17, 2024
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
Dev To
An online community for sharing and discovering great ideas, having debates, and making friendsMore About this Source Visit Dev To