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.