Em shells tradicionais, o status do primeiro comando em um pipeline não é relatado ao script. Apenas o status do último comando está disponível, em $?
.
No bash ≥3.0, quando você quiser fazer é parar se ocorrer um erro em qualquer lugar do pipeline, use o pipefail
opção .
g++ -c source.cpp -o source.o 2>&1 | perl /bin/gSTLFilt.pl
Mais geralmente, no bash, a matriz PIPESTATUS
generaliza $?
para cobrir todos os comandos no último pipeline.
$ (exit 1) | (exit 2) | (exit 3); echo ${PIPESTATUS[@]}
1 2 3
Zsh tem o mesmo recurso, apenas o array é chamado pipestatus
.
% zsh -c '(exit 1) | (exit 2) | (exit 3); echo $pipestatus'
1 2 3
Se você estiver disposto a assumir o bash (que IIRC é o shell fornecido por msys como sh
), então você pode usar PIPESTATUS
. Se não estiver, você pode organizar passar o status de saída para o shell de nível superior por meio do pipe e fazer com que o programa de filtro saia com o status que ele lê na última linha de entrada, em vez de usá-lo como entrada normal. É desajeitado, mas pode ser útil.
Em makefiles, é relativamente comum usar arquivos temporários, tratando as mensagens do compilador como mais um arquivo intermediário.
%.otmp %.g++-log: %.cpp
g++ -c $< -o $@tmp 2>&1 >$*.g++-log
%.o: %.otmp %.g++-log
perl /bin/gSTLFilt.pl <$*.g++-log
mv $*.otmp $@