O Que É um Pipe? Conectando Comandos no Shell
Um pipe, escrito com o caractere | , conecta a saída padrão de um comando à entrada padrão do próximo, permitindo encadear ferramentas.
O pipe é uma das ideias mais poderosas do shell: pequenos programas que cada um faz uma coisa, conectados de modo que a saída de um se torna a entrada do próximo. Scripts de CI usam pipes constantemente, mas eles também escondem uma armadilha, onde uma falha no meio do pipeline pode passar despercebida a menos que você opte por um comportamento mais rigoroso.
O que um pipe faz
O operador | pega o stdout do comando à sua esquerda e o alimenta como o stdin do comando à sua direita. cat log.txt | grep ERROR | wc -l conta linhas de erro encadeando três ferramentas.
Por que pipes são úteis
Pipes permitem compor comandos simples em comportamento complexo sem arquivos temporários. Cada programa permanece focado, e você os monta como blocos de construção na linha de comando.
A armadilha do código de saída
- Por padrão o código de saída de um pipeline é apenas o do último comando.
- Se um comando anterior falha mas o último tem sucesso, o pipeline parece bom.
- Isso pode mascarar falhas reais dentro de um step de CI.
Corrigindo com pipefail
Executar set -o pipefail muda a regra: o pipeline falha se qualquer comando nele falhar. Combinado com set -e, isso faz um estágio quebrado realmente parar o job em vez de passar despercebido.
Pipes em CI
Um bug clássico de CI é generate | tee output.txt onde generate trava mas tee tem sucesso, então o step passa com saída vazia. Adicionar set -o pipefail captura exatamente isso, que é por que ele pertence a set -euo pipefail.
Pipelines confiáveis em runners gerenciados
Nos runners da Latchkey, habilitar pipefail no topo de um step significa que uma falha em qualquer parte de um pipe faz o job falhar. Isso transforma bugs silenciosos e difíceis de rastrear em falhas claras e precoces.
Principais conclusões
- Um pipe conecta o stdout de um comando ao stdin do próximo comando.
- Por padrão apenas o código de saída do último comando conta, ocultando falhas no meio do pipe.
set -o pipefailfaz qualquer comando que falha fazer o pipeline inteiro falhar.