Should I output to a temporary file, then copy it over the final file only if the backup works?
Não copie, mas renomeie.
Mas isso é impossível para o script de backup se ele gravar em stdout
. Ele não pode impedir que o arquivo vazio seja criado, como já aconteceu quando o script é iniciado. Isso deve ser feito do lado de fora.
if ./script.sh >backup.tmp; then
mv backup.tmp backup
else
rm backup.tmp
fi