2014-12-02 11 views
6

Ogni sistema che ho usato in passato continua i miei semplici script bash se una riga restituisce un risultato diverso da zero. Alcuni nuovi sistemi Ubuntu LTS 14.x ora escono dal primo errore. Ho usatoScript di Bash che termina dopo il primo risultato diverso da zero anche se -e non è impostato in ENV

echo $- 

e e non compare nell'elenco. Cos'altro dovrei cercare?

Aggiunto da commentare:

$ declare -f command_not_found_handle 
command_not_found_handle() 
{ 
    if [ -x /usr/lib/command-not-found ]; then 
     /usr/lib/command-not-found -- "$1"; 
     return $?; 
    else 
     if [ -x /usr/share/command-not-found/command-not-found ]; then 
      /usr/share/command-not-found/command-not-found -- "$1"; 
      return $?; 
     else 
      printf "%s: command not found\n" "$1" 1>&2; 
      return 127; 
     fi; 
    fi 
} 
+1

Il comando 'declare -f command_not_found_handle' restituisce qualcosa? –

+0

Sì, il risultato è come previsto, credo 'command_not_found_handle() { if [-x/usr/lib/comando-non-trovato]; quindi /usr/lib/comando-non-trovato - "$ 1"; ritorno $ ?; else se [-x/usr/share/comando-non-trovato/comando-non-trovato]; quindi /usr/share/comando-non-trovato/comando-non-trovato - "$ 1"; ritorno $ ?; else printf "% s: comando non trovato \ n" "$ 1" 1> & 2; ritorno 127; fi; fi } ' –

+1

Quindi il tuo script uscirà se tenti di utilizzare qualsiasi comando che non può essere trovato dove uno di questi script restituisce un valore diverso da zero o quando nessuno di questi script può essere trovato. Con quale codice di uscita viene eseguito lo script? A che punto della sceneggiatura? Cosa ti mostra 'set -x'? –

risposta

1

Utilizzare un bash trappola nello script, vedere l'esempio di seguito di uno script bash:

#!/usr/bin/bash 

main() { 
    trap 'error_handler ${LINENO} $?' ERR 
    ###### put your commands in the following 
    echo "START" 

    non_existent_command 

    echo "END" 
} 

error_handler() { 
    process="$0" 
    lastline="$1" 
    lasterr="$2" 
    printf 'ERROR: %s: line %s: last command exit status: %s \n' "$process" "$lastline" "$lasterr" 
    trap - ERR 
    exit 0 
} 

main 

se si tenta di lanciare un comando inesistente (non_existent_command nell'esempio) o un comando con stato di uscita diverso da 0 il trap attiverà la funzione error_handler che contiene il comando di uscita exit 0. Nell'esempio sopra l'uscita sarà:

>START 
>./new.sh: line 8: non_existent_command: command not found 
>ERROR: ./new.sh: line 8: last command exit status: 127 

nota che "START" viene stampato, ma "fine" non è.