2010-03-13 1 views
6

Ho alcuni script di bash critici che vengono richiamati dal codice che non controllo e dove non riesco a vedere l'output della console. Voglio una traccia completa di ciò che questi script hanno fatto per analisi successive. Per fare questo voglio rendere ogni script auto-tracciato. Ecco cosa sto facendo attualmente:Un modo migliore per eseguire il tracciamento di uno script bash?

#!/bin/bash 
# if last arg is not '_worker_', relaunch with stdout and stderr 
# redirected to my log file... 
if [[ "$BASH_ARGV" != "_worker_" ]]; then 
    $0 "[email protected]" _worker_ >>/some_log_file 2>&1 # add tee if console output wanted 
    exit $? 
fi 
# rest of script follows... 

Esiste un modo migliore e più pulito per farlo?

risposta

12
#!/bin/bash 
exec >>log_file 2>&1 

echo Hello world 
date 

exec ha un comportamento particolare per quanto riguarda redirezioni: “Se comando non è specificato, qualsiasi ridirezione ha effetto nella shell corrente, e lo stato di ritorno è 0. Se si verifica un errore di reindirizzamento, lo stato di ritorno è 1. "

Inoltre, per quanto riguarda la soluzione originale, exec "$0" è migliore di "$0"; exit $?, poiché il primo non lascia un processo di shell aggiuntivo fino a quando non si chiude il sottoprocesso.

+0

Più eccellente! Sapevo solo che doveva esserci un modo più elegante. Grazie, Kevin; questo andrà in uso immediato ... –

+1

può anche essere emesso sul terminale corrente e accedere a un file? Ho provato a usare 'tee' con' exec' ma non ho trovato modo .. –

+1

Vorrei collegare a [questa domanda] (http://stackoverflow.com/questions/3173131/redirect-copy-of-stdout-to -log-file-from-inside-bash-script-itself) dove è possibile vedere l'output e anche loggarlo, tutto comandato dallo script! –

2

forse stai cercando set -x?

+0

@aaa: Sì, so di "set -x" - questa è una delle cose che uso occasionalmente nella sezione "# resto dello script segue ..." sopra. Avrei dovuto accennarlo; grazie per averlo fatto –