Programação Shell: Dominando o Operador Pipe

Função dos Pipes

Um pipe na verdade serve como ferramenta de comunicação entre processos, e quando aplicado aos comandos Linux, facilita a interação entre dois comandos distintos.

O Operador Pipe

O operador pipe (também conhecido como pipe anônimo) é uma ferramenta de comunicação frequentemente utilizada em programação Shell.

O símbolo do pipe é "|" e sua principal função é conectar duas aplicações, direcionando a saída da primeira aplicação como entrada para a segunda. Se houver uma terceira aplicação, a saída da segunda pode ser usada como entrada para a terceira, e assim por diante.

Por exemplo, no comando ls | grep arquivo_teste, filtramos o arquivo arquivo_teste no diretório atual:

[root@terminal /]# ls 
bin   dados  etc   lib    lost+found  rede   opt   root  selinux  sys    usr
boot  dev   home  lib64  media       mnt   proc  sbin  srv   arquivo_teste   tmp
[root@terminal /]# ls | grep arquivo_teste 
arquivo_teste

O pipe "|" transfere a lista de arquivos do comando ls para o comando grep arquivo_teste realizar a filtragem.

Operador Pipe vs Ponto e Vírgula

É importante notar uma característica específica do operador pipe: quando utilizado, ele cria processos filhos para cada comando conectado. Podemos observar isso no seguinte exemplo:

[root@terminal /]# cat | ps -ef
UID         PID   PPID  C STIME TTY          TIME CMD
root       1234   1230  0 14:57 pts/0    00:00:00 -bash
root      54321  1234  0 19:51 pts/0    00:00:00 cat
root      54322  1234  0 19:51 pts/0    00:00:00 ps -ef

O processo pai bash tem PID 1234, enquanto os processos filhos cat e ps -ef têm PIDs 54321 e 54322 respectivamente.

Devido ao fato de que o pipe cria processos filhos para os comandos conectados, o ambiente atual não é afetado.

Vamos verificar com o comando cd /home/ | ls:

[root@terminal /]# cd /home/ | ls 
bin   dados  etc   lib    lost+found  rede   opt   root  selinux  sys    usr
boot  dev   home  lib64  media       mnt   proc  sbin  srv   arquivo_teste   tmp   
[root@terminal /]# pwd
/

Como podemos observar, comandos que modificam o ambiente atual, como cd, não afetam o ambiente quando usados com pipes.

E o que acontece quando conectamos dois comandos com ponto e vírgula ";"?

[root@terminal /]# cd /sys/ ; ls
block  bus  class  dev  devices  firmware  fs  hypervisor  kernel  module  power
[root@terminal sys]# pwd
/sys

Perceba que, ao usar o ponto e vírgula, o comando cd afeta o ambiente atual.

Conclusão

Tanto o operador pipe quanto o ponto e vírgula podem conectar dois comandos, mas suas funções são distintas. O ponto e vírgula simplesmente separa dois comandos, executando o primeiro e depois o segundo, sem qualquer relação entre eles.

O pipe funciona passando o resultado do primeiro comando como entrada para o segundo. Ao mesmo tempo, cria processos filhos para ambos os comandos. Como os comandos são executados em processos separados, comandos embutidos como cd (que mudam diretório) não afetam o ambiente atual. Portanto, ao usar pipes, é importante evitar comandos embutidos que dependem do ambiente de execução.

Tags: shell-scripting Linux pipes operadores-de-shell programação-linux

Publicado em 7-5 21:31