Sto testando cose diverse nello scripting bash e mi sono imbattuto in un problema di cui non riesco a ottenere una spiegazione.

Lo sono scrivendo di proposito un comando sbagliato, per ottenere un codice di uscita diverso da 0, ma in qualche modo sembra che ottenga ancora 0.

Il codice che sto eseguendo è:

USER_NAME=$(id -uns) if [[ ${?} -ne 0 ]] then echo "Your command failed to execute with exit code ${?}" exit 1 fi echo "Your username is ${USER_NAME}" 

Loutput del mio codice è:

id: unknown option – s

Prova “id –help” per ulteriori informazioni.

Il tuo comando non è stato eseguito con il codice di uscita 0

Il tuo nome utente è

Immagino che in qualche modo stia visualizzando il codice di uscita per il comando echo? Anche così, se il codice di uscita è 0, perché entra nellistruzione if?

Se questo è il problema, come posso fare in modo che visualizzi il codice di uscita effettivo che dovrebbe essere visualizzato?

Risposta

Nel codice, allinterno dellistruzione if, lo stato di uscita che ottiene stampato è lo stato di uscita del test [[ ${?} -ne 0 ]]. Il valore $? è sempre lo stato di uscita del comando eseguito più di recente e il test conta come un comando, almeno per quanto riguarda limpostazione del valore di $? al suo risultato.

Se vuoi stampare lo stato di uscita di id, assegnalo a una variabile il cui valore non cambierà,

id -uns err=$? if [[ $err -ne 0 ]]; then printf "id failed with code %d\n" "$err" >&2 exit 1 fi 

Commenti

  • Questo script non POSIX non viene eseguito test[[ fa parte della sintassi ksh ed è eseguito come parte dellinterprete, ma non come integrato Tuttavia, sembra che questa parte dellinterprete ripristini il codice di uscita memorizzato.
  • Perché lo script esegue entrambi i echo? Me lo sarei aspettato per uscire dopo il primo e non arrivare al secondo.
  • @pericynthion Non mostrano il codice che hanno effettivamente eseguito. Loutput che mostrano proviene da una versione del loro codice senza listruzione exit 1 al suo interno. Probabilmente è stato aggiunto in seguito.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *