GNU/Linux >> Linux Esercitazione >  >> Linux

Codici di uscita della riga di comando di Bash demistificati

Quando esegui un comando o esegui uno script, ricevi un codice di uscita . Un codice di uscita è una risposta del sistema che segnala l'esito positivo, un errore o un'altra condizione che fornisce un indizio su ciò che ha causato un risultato imprevisto dal comando o dallo script. Tuttavia, potresti non conoscere mai il codice, perché un codice di uscita non si rivela a meno che qualcuno non glielo chieda di farlo. I programmatori usano i codici di uscita per aiutare a eseguire il debug del loro codice.

Nota: Vedrai spesso codice di uscita denominato stato di uscita o anche come codici dello stato di uscita . I termini sono usati in modo intercambiabile tranne che nella documentazione. Spero che il mio uso dei due termini ti sia chiaro.

Non sono un programmatore. È difficile per me ammetterlo, ma è vero. Ho studiato BASIC, FORTRAN e alcuni altri linguaggi sia formalmente che informalmente, e devo dire che non sono assolutamente un programmatore. Oh certo, posso scrivere e programmare un po' in PHP, Perl, Bash e persino PowerShell (sì, sono anche un amministratore di Windows), ma non potrei mai guadagnarmi da vivere con la programmazione perché sono troppo lento nello scrivere codice e tentativi ed errori non sono una strategia di debug efficiente. È triste, davvero, ma sono abbastanza competente nel copiare e adattare il codice trovato da poter svolgere i compiti richiesti. Eppure, uso anche i codici di uscita per capire dove sono i miei problemi e perché le cose stanno andando storte.

[ Potrebbe piacerti anche: Una piccola copia magica di file SSH sulla riga di comando. ]

I codici di uscita sono utili in una certa misura, ma possono anche essere vaghi. Ad esempio, un codice di uscita 1 è un bucket generico per errori vari e non è affatto utile. In questo articolo spiego la manciata di codici di errore riservati , come possono verificarsi e come utilizzarli per capire qual è il tuo problema. Un codice di errore riservato è quello utilizzato da Bash e non dovresti creare i tuoi codici di errore che sono in conflitto con essi.

Abbastanza retroscena. È ora di guardare esempi di ciò che genera codici/stati di errore.

Estrazione dell'elusivo codice di uscita

Per visualizzare il codice di uscita per l'ultimo comando eseguito sulla riga di comando, utilizzare il comando seguente:

$ echo $?

La risposta visualizzata non contiene sfarzo o circostanza. È semplicemente un numero. Potresti anche ricevere un messaggio di errore della shell da Bash che descrive ulteriormente l'errore, ma il codice di uscita e l'errore della shell insieme dovrebbero aiutarti a scoprire cosa è andato storto.

Stato uscita 0

Uno stato di uscita di 0 è il miglior scenario possibile, in generale. Ti dice che il tuo ultimo comando o script è stato eseguito correttamente. Il successo è relativo perché il codice di uscita ti informa solo che lo script o il comando è stato eseguito correttamente, ma il codice di uscita non ti dice se le informazioni da esso hanno valore. Gli esempi illustreranno meglio ciò che sto descrivendo.

Ad esempio, elenca i file nella tua home directory. Non ho nient'altro nella mia home directory a parte i file e le directory nascosti, quindi niente da vedere qui, ma il codice di uscita non si preoccupa di nient'altro che del successo dell'esecuzione del comando:

$ ls
$ echo $?
0

Il codice di uscita 0 significa che ls il comando è stato eseguito senza problemi. Anche se, ancora una volta, le informazioni del codice di uscita non forniscono alcun valore reale per me.

Ora, esegui ls comando su /etc directory e quindi visualizzare il codice di uscita:

$ ls /etc
**Many files**
$ echo $?
0

Puoi vedere che qualsiasi esecuzione riuscita si traduce in un codice di uscita pari a 0, incluso qualcosa che è totalmente sbagliato, come l'emissione di cat comando su un file eseguibile binario come ls comando: 

$ cat /usr/bin/ls
**A lot of screen gibberish and beeping**
$ echo $?
0

Uscita stato 1

Utilizzando l'esempio sopra, ma aggiungendo l'elenco lungo e le opzioni ricorsive (-lR ), ricevi un nuovo codice di uscita 1:

$ ls -lR /etc
**A lengthy list of files**
$ echo $?
1

Sebbene l'output del comando sembri che tutto sia andato bene, se scorri verso l'alto vedrai diversi errori "Autorizzazione negata" nell'elenco. Questi errori generano uno stato di uscita pari a 1, che viene descritto come "operazioni non consentite". Anche se potresti aspettarti che un errore "Autorizzazione negata" porti a uno stato di uscita di 1, ti sbagli, come vedrai nella prossima sezione.

La divisione per zero, tuttavia, ti dà uno stato di uscita di 1. Ricevi anche un errore dalla shell per informarti che l'operazione che stai eseguendo è "non ammissibile:"

$ let a=1
$ let b=0
$ let c=a/b
-bash: let: c=a/b: division by 0 (error token is "b")
$ echo $?
1

Senza un errore della shell, uno stato di uscita di 1 non è molto utile, come puoi vedere dal primo esempio. Nel secondo esempio, sai perché hai ricevuto l'errore perché Bash te lo dice con un messaggio di errore della shell. In generale, quando ricevi uno stato di uscita pari a 1, cerca le operazioni non consentite (Autorizzazione negata messaggi) mischiati ai tuoi successi (come l'elenco di tutti i file in /etc , come nel primo esempio in questa sezione).

Uscita stato 2

Come indicato sopra, un avviso di shell di "Autorizzazione negata" risulta in uno stato di uscita di 2 anziché 1. Per dimostrarlo a te stesso, prova a elencare i file in /root :

$ ls /root
ls: cannot open directory '/root': Permission denied
$ echo $?
2

Lo stato di uscita 2 viene visualizzato quando si verifica un problema con le autorizzazioni o una parola chiave mancante in un comando o uno script. Un esempio di parola chiave mancante è dimenticare di aggiungere un done in uno script do ciclo continuo. Il metodo migliore per il debug degli script con questo stato di uscita consiste nell'emettere il comando in una shell interattiva per vedere gli errori ricevuti. Questo metodo generalmente rivela dove si trova il problema.

I problemi di autorizzazione sono un po' meno difficili da decifrare ed eseguire il debug rispetto ad altri tipi di problemi. L'unica cosa che significa "Autorizzazione negata" è che il tuo comando o script sta tentando di violare una restrizione di autorizzazione.

Stato uscita 126

Lo stato di uscita 126 è un codice di errore di autorizzazione interessante. Il modo più semplice per dimostrare quando viene visualizzato questo codice è creare un file di script e dimenticare di concedere l'autorizzazione all'esecuzione del file. Ecco il risultato:

$ ./blah.sh
-bash: ./blah.sh: Permission denied
$ echo $?
126

Questo problema di autorizzazione non è di accesso, ma di impostazione, come in modalità. Per eliminare questo errore e ricevere invece uno stato di uscita pari a 0, emettere chmod +x blah.sh .

Nota: Riceverai uno stato di uscita pari a 0 anche se il file eseguibile non ha contenuto. Come affermato in precedenza, il "successo" è suscettibile di interpretazione.

Ricevo uno stato di uscita di 126. Questo codice in realtà mi dice cosa c'è che non va, a differenza dei codici più vaghi.

Stato uscita 127

Lo stato di uscita 127 ti dice che è successa una delle due cose: il comando non esiste o il comando non è nel tuo percorso ($PATH ). Questo codice viene visualizzato anche se tenti di eseguire un comando che si trova nella directory di lavoro corrente. Ad esempio, lo script sopra a cui hai concesso l'autorizzazione di esecuzione si trova nella tua directory corrente, ma tenti di eseguire lo script senza specificare dove si trova:

$ blah.sh
-bash: blah.sh: command not found
$ echo $?
127

Se questo risultato si verifica in uno script, provare ad aggiungere il percorso esplicito all'eseguibile o allo script del problema. L'ortografia conta anche quando si specifica un eseguibile o uno script.

[ I lettori hanno apprezzato anche: 10 comandi Linux di base che devi conoscere. ]

Stato uscita 128

Lo stato di uscita 128 è la risposta ricevuta quando nella programmazione viene utilizzato un codice di uscita fuori gamma. In base alla mia esperienza, non è possibile produrre lo stato di uscita 128. Ho provato più azioni per un esempio e non riesco a farlo accadere. Tuttavia, posso produrre un codice adiacente a 128 stato di uscita. Se il tuo codice di uscita supera 256, lo stato di uscita restituito è il codice di uscita sottratto per 256. Questo risultato suona strano e può effettivamente creare uno stato di uscita errato. Controlla gli esempi per vedere di persona.

Usando un codice di uscita di 261, crea uno stato di uscita di 5:

$ bash
$ exit 261
exit
$ echo $?
5

Per produrre uno stato di uscita errato di 0:

$ bash
$ exit 256
exit
$ echo $?
0

Se utilizzi 257 come codice di uscita, il tuo stato di uscita è 1 e così via. Se il codice di uscita è un numero negativo, lo stato di uscita risultante è quel numero sottratto da 256. Quindi, se il tuo codice di uscita è 20, lo stato di uscita è 236.

preoccupante, non è vero? La soluzione, per me, è evitare di utilizzare codici di uscita riservati e fuori portata. L'intervallo corretto è 0-255.

Stato uscita 130

Se stai eseguendo un programma o uno script e premi Ctrl-C per interromperlo, il tuo stato di uscita è 130. Questo stato è facile da dimostrare. Emettere ls -lR / e quindi premere immediatamente Ctrl-C:

$ ls -lR /
**Lots of files scrolling by**
^C
$ echo $?
130

Non c'è molto altro da dire su questo. Non è uno stato di uscita molto utile, ma qui è come riferimento.

Stato uscita 255

Questo stato di uscita riservato finale è facile da produrre ma difficile da interpretare. La documentazione che ho trovato afferma che ricevi lo stato di uscita 255 se utilizzi un codice di uscita che non rientra nell'intervallo 0-255.

Ho scoperto che questo stato può essere prodotto anche in altri modi. Ecco un esempio:

$ ip
**Usage info for the ip command**
  
$ echo $?
255

Alcune autorità indipendenti affermano che 255 è un codice di errore di errore generale. Non posso né confermare né smentire tale affermazione. So solo che posso produrre lo stato di uscita 255 eseguendo comandi particolari senza opzioni.

[ Articolo correlato: 10 altri comandi Linux essenziali che devi conoscere. ]

Conclusione

Ecco qua:una panoramica dei numeri di stato di uscita riservati, il loro significato e come generarli. Il mio consiglio personale è di controllare sempre le autorizzazioni e i percorsi per qualsiasi cosa tu esegua, specialmente in uno script, invece di fare affidamento sui codici di stato di uscita. Il mio metodo di debug prevede che quando un comando non funziona correttamente in uno script, eseguo il comando individualmente in una shell interattiva. Questo metodo funziona molto meglio che provare tattiche fantasiose con interruzioni e uscite. Seguo questa strada perché (il più delle volte) i miei errori sono relativi alle autorizzazioni, quindi sono stato addestrato per iniziare da lì.

Divertiti a controllare i tuoi stati e ora è il momento di uscire.

[ Vuoi provare Red Hat Enterprise Linux? Scaricalo ora gratuitamente. ]


Linux
  1. La differenza tra gli operatori Bash [[ Vs [ Vs ( Vs ((?

  2. In che modo Bash valuterà il seguente codice?

  3. 5 Completamento standard disponibile nella riga di comando di Linux Bash

  4. Bash Prompt con il codice dell'ultima uscita

  5. Codice di uscita dall'assegnazione della variabile alla sostituzione dei comandi in Bash

Bash wait Comando

Comando di uscita Bash e codici di uscita

Comando Bash printf

Come visualizzare la cronologia di Bash senza numeri di riga

Bash:loop fino a quando lo stato di uscita del comando è uguale a 0

Bash se su una sola riga