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.