Domanda Come verificare se un comando è riuscito?


C'è un modo per controllare se c'è un errore nell'esecuzione di un comando?

Esempio :

test1=`sed -i "/:@/c connection.url=jdbc:oracle:thin:@$ip:1521:$dataBase" $search`
valid $test1

function valid () {
  if $test -eq 1; then
    echo "OK"
    else echo "ERROR" 
  fi
}

Ho già provato a farlo ma sembra che non funzioni. Io non so come farlo.


159
2018-03-07 11:40


origine


Preferire $ (Foo) oltre i backtick `foo`, perché puoi annidarlo ed è più facile distinguere dagli apostrofi. - user unknown
A proposito, è necessario definire una funzione (valid) prima di chiamarlo. - wjandrea


risposte:


Il valore di ritorno è memorizzato in $?. 0 indica successo, altri indica errore.

some_command
if [ $? -eq 0 ]; then
    echo OK
else
    echo FAIL
fi

Come qualsiasi altro valore testuale, puoi memorizzarlo in una variabile per un confronto futuro:

some_command
retval=$?
do_something $retval
if [ $retval -ne 0 ]; then
    echo "Return code was not zero but $retval"
fi

Per possibili operatori di confronto, vedere man test.


238
2018-03-07 12:06



È bello ... posso tenere l'errore di uscita ?? !! , perché in questo caso ho 2 errori: comando errore "testo" ex, file non trovato e il mio errore "testo" che in questo caso non è riuscito ad esempio - moata_u
@moata_u: puoi memorizzare il valore in una variabile come mostrato nella mia risposta. - Lekensteyn
@moata_u: Devi mettere un ; prima di else e fi: `se ...; poi ...; altro ...; fi - Lekensteyn
Questo è un uso inutile di test. - David Foerster
@Blauhirn [ $? ] (o in modo equivalente, test $?) non funziona perché $? valuta un numero (0, 1, ecc.) che non è nullo. Vedere il documenti per test: "Se EXPRESSION viene omesso," test "restituisce false. Se EXPRESSION è un singolo argomento," test "restituisce false se l'argomento è null e true altrimenti." - Lekensteyn


Se hai solo bisogno di sapere se il comando ha avuto esito positivo o negativo, non preoccuparti di testare $?, basta testare direttamente il comando. Per esempio.:

if some_command; then
    printf 'some_command succeeded\n'
else
    printf 'some_command failed\n'
fi

E assegnare l'output a una variabile non cambia il valore di ritorno (beh, a meno che non si comporti diversamente quando stdout non è un terminale ovviamente).

if output=$(some_command); then
    printf 'some_command succeded, the output was «%s»\n' "$output"
fi

http://mywiki.wooledge.org/BashGuide/TestsAndConditionals spiega if più in dettaglio.


60
2018-03-08 23:54



Che cosa succede se si vuole fare qualcosa di diverso da ramificazioni come memorizzare il valore booleano di se ha fallito o meno in un .ini? Quindi la variabile di output non lo fa, ma $? sì, quindi non sei corretto nel dire che testare direttamente il comando è strettamente migliore. - Timothy Swan


command && echo OK || echo Failed

19
2017-12-01 21:19



Se command ritorna errore sullo schermo, come nasconderlo? - Sigur
Se command scrive errori su stderr, puoi usare il modulo command 2> /dev/null && echo OK || echo Failed. Il 2> /dev/null reindirizza l'output di stderr a /dev/null. Tuttavia, alcune utility scriveranno degli errori nello stdout (anche se questa è una cattiva pratica). In questo caso è possibile omettere il 2 dal reindirizzamento, ma si perderà qualsiasi output dal comando. Questo metodo di verifica del successo è buono per la semplice logica ternaria, ma per un comportamento più complesso è meglio controllare $? per il comando di successo, o utilizzare il if metodo di blocco delineato nella risposta di @ geirha. - Bender the Greatest


$? dovrebbe contenere lo stato di uscita del comando precedente, che dovrebbe essere zero per nessun errore.

Quindi, qualcosa del genere;

cd /nonexistant
if [ $? -ne 0 ]
then
    echo failed
else
    echo success!
fi

per la maggior parte dei casi, è più facile usare i comandi && construct to chain che devono dipendere l'uno dall'altro. Così cd /nonexistant && echo success! voluto non echo successo perché il comando si interrompe prima di &&. Il corollario di questo è ||, dove cd /nonexistant || echo fail  voluto echo fail perché cd fallito. (questo diventa utile se si usa qualcosa come || exit, che terminerà lo script se il precedente comando fallisce).


12
2018-03-07 12:04



È bello ... posso tenere l'errore di uscita ?? !! , perché in questo caso ho 2 errori: comando errore "testo" ex, file non trovato e il mio errore "testo" che in questo caso non è riuscito ad esempio - moata_u
@moata_u, vedi mywiki.wooledge.org/BashFAQ/002 - geirha


command && echo $? || echo $?

4
2017-08-12 16:01





Per errore di prova i tuoi comandi:

execute [INVOKING-FUNCTION] [COMMAND]

execute () {
    error=$($2 2>&1 >/dev/null)

    if [ $? -ne 0 ]; then
        echo "$1: $error"
        exit 1
    fi
}

Inspired nella produzione Lean:


2
2017-12-29 04:20





Si dovrebbe notare che if...then...fi e &&/|| il tipo di approccio si occupa dello stato di uscita restituito dal comando che vogliamo testare (0 in caso di successo); tuttavia, alcuni comandi non restituiscono uno stato di uscita diverso da zero se il comando non riesce o non è in grado di gestire l'input. Ciò significa che il solito if e &&/|| gli approcci non funzioneranno per quei comandi particolari.

Ad esempio, su GNU Linux file esce ancora con 0 se ha ricevuto un file non esistente come argomento e find impossibile trovare il file specificato dall'utente.

$ find . -name "not_existing_file"                                          
$ echo $?
0
$ file ./not_existing_file                                                  
./not_existing_file: cannot open `./not_existing_file' (No such file or directory)
$ echo $?
0

In questi casi, un modo potenziale per gestire la situazione è la lettura stderr/stdin messaggi, ad es. quelli che sono tornati da file comando, o analizza l'output del comando come in find. A tal fine, case dichiarazione potrebbe essere utilizzata.

$ file ./doesntexist  | while IFS= read -r output; do                                                                                                                  
> case "$output" in 
> *"No such file or directory"*) printf "%s\n" "This will show up if failed";;
> *) printf "%s\n" "This will show up if succeeded" ;;
> esac
> done
This will show up if failed

$ find . -name "doesn'texist" | if ! read IFS= out; then echo "File not found"; fi                                                                                     
File not found

(Si tratta di un ripostaggio della mia risposta su domanda correlata a unix.stackexchange.com )


0
2017-11-13 18:58





Come menzionato in molte altre risposte, un semplice test di $? farà, come questo

if [ $? -eq 0 ]; then something; fi

Se vuoi testare il comando mancato, puoi usare una versione più breve in bash (ma forse eccessivo) come segue:

if (($?)); then something; fi

Funziona usando il (( )) modalità aritmetica, quindi se il comando è tornato success, cioè $? = 0 quindi il test valuta ((0)) quale prova come false, altrimenti ritornerà true.

Per testare successo, puoi usare:

if ! (($?)); then something; fi

ma non è molto più breve del primo esempio.


0
2017-08-16 21:07