Acontece que a ativação do controle de tarefas é uma solução - mas apenas se não houver SIGSEGV
trap, configuração que impede a saída detalhada.
set -o errexit
set -o pipefail
set -o monitor
trap 'echo "ERR $?"' ERR
echo "hi" | ./docrash | cat
echo "not reached"
Rodar isso dá exatamente a saída que eu estava procurando e muito mais. Imprime o PID para cada criança e mostra o erro:
$ ./err.sh >& err.log
$ cat err.log
./err.sh: line 21: 25110 Done echo "hi"
25111 Segmentation fault (core dumped) | ./docrash
25112 | cat
ERR 139
$ gdb docrash core.25111
...
As configurações podem ser combinadas, se você quiser ver falhas no pipe, mas não abortar o script que isso funciona:
set -o pipefail
set -o monitor
echo "hi" | ./docrash | cat
echo "pipe returned $?"
Imprime o traçado e continua:
$ ./err.sh
./err.sh: line 21: 25110 Done echo "hi"
25111 Segmentation fault (core dumped) | ./docrash
25112 | cat
pipe returned 139