Sua ideia inicial é boa e pode ser expandida para
if ! CMD >file.out; then rm file.out; exit 1; fi
Se você precisar capturar o status de saída específico de CMD
, faça isso e exit
com ele mais tarde:
if ! CMD >file.out; then err="$?"; rm file.out; exit "$err"; fi
Não é possível usar exit "$?"
, pois nesse momento, rm
modificou $?
.
tee
sempre criará seu arquivo de saída, independentemente de os dados estarem disponíveis para serem inseridos, portanto, você terá o mesmo problema que teve desde o início.