O problema foi set -e . Se alguém pressionar, e. Ctrl-c enquanto vários comandos são canalizados juntos, SIGINT não é enviado para o script, mas em outro lugar. Isso cria um erro que é manipulado por set -e e, portanto, o script sai diretamente. Para usar set -e confiável em scripts com pipes, também é necessário interceptar EXIT :
#!/bin/sh
set -e
temp_dir='mktemp -d'
cd $temp_dir
trap "rm -r $temp_dir; exit" HUP INT TERM PIPE EXIT
for db in db1 db2 db3
do
pg_dump $db postgres > $db.sql
done
tar cJf - .
Nesse caso, também o exit normal é tratado pelo trap, que em muitos casos é útil de qualquer maneira.