Il reindirizzamento dell'output apre il file prima dell'esecuzione dello script, quindi non è possibile stabilire se il file riceverà un output. Cosa si può fare, però, è immediatamente eliminare il file se si finisce per essere vuota:
logfile="errorlog.$(date)"
# Note your typo; it's 2>, not >2
script 2> "$logfile"; [ -s "$logfile" ] || rm -f "$logfile"
Io uso -f
solo nel caso in cui, come -s
può fallire se $logfile
non esiste, non solo se è vuota. Io uso ;
per separare i comandi perché se lo $logfile
contiene o meno qualcosa dipende o meno dal fatto che lo sia o meno script
.
È possibile eseguire il wrap in una funzione per facilitarne l'utilizzo.
save_log() {
logfile=${1:-errorlog.$(date)}
cat - > "$logfile"
[ -s "$logfile" ] || rm -f "$logfile"
}
script 2> >(save_log)
script 2> >(save_log my_logfile.txt)
Non è così semplice come il reindirizzamento a un file, e dipende da una caratteristica non standard (sostituzione di processo), ma non troppo male, neanche.
Ho creato uno script di esempio con un errore e ho usato il tuo primo esempio. Crea ogni volta un nuovo file di registro con successo. Crea comunque un file di registro vuoto quando eseguo lo script fisso, e non cancella il file. Pensi che sia necessario modificare la parte principale? – bkstack
L'ho capito. Non stavo mettendo ./ davanti a $ logfile Ho usato il seguente per risolvere il problema. logfile = "errorlog. $ (Date)" ./script 2> "./