Ho testato 4 modi diversi.
I primi 2 fanno leva sul ifne
(comando che fa parte delle moretuils).
Il problema di fondo è che, pur usando ifne, bash creava file.log, poiché bash “predispone” tutti i comandi e relativi file, indipendentemente che poi la pipe abbia successo.
Il terzo caso sfrutta una variabile dove inserire l’output.
Se la variabile è “piena”, esegue il comando che scrive il file.
La quarta e ultima soluzione crea un file temporaneo e lo sposta se contiene qualcosa (non è vuoto).
# Errato
command | ifne cat > file.log
# Soluzione 1
command | ifne bash -c "cat > file.log"
# Soluzione 2
command | ifne tee file.log > /dev/null
# Soluzione 3
output="$(command)"
[ -n "$output" ] && echo "$output" > file.log
# Soluzione 4
tmp_file=$(mktemp)
command > $tmp_file
[ -s $tmp_file ] && mv $tmp_file file.log