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.