2012-05-24 15 views
16

Sto usando set -e per interrompere l'esecuzione di uno script al primo errore.Come visualizzare l'ultimo comando che ha avuto esito negativo durante l'utilizzo di bash set -e?

Il problema è che questo non mi dice cosa è andato storto.

Come è possibile aggiornare uno script di bash in modo che venga visualizzato l'ultimo comando non riuscito?

+2

Non usare set -e, usa il tuo controllo degli errori. – jordanm

+2

Sono d'accordo con la Giordania. Per ulteriori informazioni, consultare [BashFAQ/105] (http://mywiki.wooledge.org/BashFAQ/105). –

risposta

17

Invece di set -e, utilizzare una trappola ERR; è possibile passare $BASH_LINENO per ottenere il numero di riga specifico su cui si è verificato l'errore. Fornisco uno script approfittando di questo nella mia risposta a https://stackoverflow.com/a/185900/14122

Per riassumere:

error() { 
    local sourcefile=$1 
    local lineno=$2 
    # ...logic for reporting an error at line $lineno 
    # of file $sourcefile goes here... 
} 
trap 'error "${BASH_SOURCE}" "${LINENO}"' ERR 
+2

È inoltre possibile utilizzare insieme sia set -e' che trap ERR, se si desidera che lo script venga chiuso dopo aver chiamato la funzione trap, oppure è possibile richiamare esplicitamente 'exit' nella funzione trap quando si desidera che ciò accada. –

+1

qualsiasi idea su come farcela gestire variabili non associate 'set -u; echo $ str'? –

+0

Funziona alla grande nella nostra libreria bash di lavoro! Non più scavare per vedere quale comando ha fallito. –

1

Hai provato con --verbose?

bash --verbose script.sh 
0

Non è possibile utilizzare set -e di per sé, perché l'elaborazione si arresta immediatamente dopo qualsiasi errore. Dai uno sguardo allo Set Builtin section del Manuale di riferimento Bash per ulteriori informazioni sulle opzioni -x e -v, che puoi usare per il debug.

Qualcosa di simile:

set -e 
set -v 

uscirà su qualsiasi errore, mentre vi mostra ogni linea di ingresso come si legge. Tuttavia, non ti mostrerà solo la linea con l'errore. Per questo, dovrai fare il tuo esplicito controllo degli errori.

Ad esempio:

set +e 
if false; then 
    real_exit_status=$? 
    echo 'Some useful error message.' >&2 
    exit $real_exit_status 
fi 
0

set -ex mostrerà (tutte) le linee in cui vengono eseguiti e fermarsi al primo comando di ritorno diverso da zero (non come parte di costrutti if/while/until).

0
  1. make err.sh

    set -e 
    trap 'echo "ERROR: $BASH_SOURCE:$LINENO $BASH_COMMAND" >&2' ERR 
    
  2. includerlo (. err.sh) in tutti i vostri script.

  3. sostituire qualsiasi

    ... | while read X ; do ... ; done

    con

    while read X ; do ... ; done < <(...)

    negli script per la trappola per dare il corretto numero di riga/di comando nel messaggio di errore

Problemi correlati