2013-07-10 10 views
5

Sto usando il seguente codice per inviare stderr a un file.invia bash stderr al file di registro, ma solo se esiste un errore

.script >2 "errorlog.$(date)" 

Il problema è che viene creato un file di registro vuoto ogni volta che eseguo lo script, anche se non esiste un errore. Ho anche cercato online e in alcuni libri e non riesco a capire come creare un file di registro solo se esistono errori.

risposta

5

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.

+0

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

+0

L'ho capito. Non stavo mettendo ./ davanti a $ logfile Ho usato il seguente per risolvere il problema. logfile = "errorlog. $ (Date)" ./script 2> "./

/$ logfile"; [-s "./ /$ logfile"] || rm -f "./ $ logfile" Ho anche aggiunto il sonno tra la creazione e la cancellazione del file per assicurarmi che funzionasse. Grazie per il tuo aiuto chepner! logfile = "errorlog. $ (Date)" ./script 2> "./ /$ logfile"; dormire 2; [-s "./ /$ logfile"] || rm -f "./ /$ logfile" – bkstack