Come utilizzare i codici di uscita di Linux per risolvere i problemi del tuo sistema Linux

I codici di uscita, noti anche come codici di ritorno o stati di uscita, sono segnali numerici che un programma, comando o script restituisce al sistema operativo (o al processo chiamante) quando termina l’esecuzione. Non è necessario scavare in file di log potenzialmente lunghi per diagnosticare un errore: un codice di uscita fornisce spesso un indizio rapido sulla natura del problema.
La convenzione universalmente accettata è che quando un programma viene eseguito con successo, restituisce un codice di uscita di 0. Qualsiasi altro numero, tipicamente nell’intervallo standard da 1 a 255, indica che qualcosa è andato storto.
Il modo più semplice per controllare il codice di uscita dell’ultimo comando in primo piano eseguito in shell simili a Unix (come Bash o Zsh) è ispezionare la variabile speciale della shell $?. Ad esempio, prima esegui un comando qualsiasi e poi controlla il suo codice di uscita:
ls/nonexistent_directory
echo$?
Il comando echo $? visualizza il codice di uscita numerico memorizzato nella variabile $?. Se vedi 0, significa che il comando precedente è stato completato con successo. Un valore diverso da zero come 1, 2 o 127 indica un errore, e il numero specifico offre un indizio sul tipo di problema: forse un file mancante, una directory inesistente o permessi insufficienti.
Debugging del tuo script con i codici di uscita
I codici di uscita sono particolarmente utili quando scrivi script shell. Aiutano il tuo script a determinare se qualcosa è andato bene o male, permettendogli di decidere cosa fare dopo.
Ecco un semplice esempio che copia un file in una cartella di backup e riporta se la copia è stata eseguita con successo:
#!/bin/bash
# Prova a copiare il file
cp important_file.txt backup/
# Controlla se la copia è stata eseguita con successo utilizzando il codice di uscita ($? contiene il codice di uscita dell'ultimo comando)
if[$?-eq0]; then
echo"Backup riuscito!"
else
echo"Backup fallito con codice di uscita $?"
exit1# Esci dallo script con un codice di errore per indicare che qualcosa è andato storto.
fiQuando il comando cp viene eseguito, restituisce un codice di uscita. Un codice di uscita di 0 significa che tutto è andato liscio. Se il codice non è 0, qualcosa è andato storto e lo script stampa un messaggio di errore ed esce con un codice di 1.
Impostare i propri codici di uscita
Oltre a controllare i codici di uscita dai comandi, puoi definire i tuoi codici di uscita per indicare diversi tipi di errori. Questa pratica rende i tuoi script più informativi, consentendo a chiunque li utilizzi di comprendere esattamente quale tipo di problema si è verificato.
Considera questo script:
#!/bin/bash
# Verifica che sia fornito un argomento (nome file).
if[-z"$1"]; then
echo"Uso: $0 "
exit1# Il codice di uscita 1 indica che non è stato fornito alcun argomento.
fi
# Controlla se il file fornito come primo argomento esiste.
if[!-f"$1"]; then
echo"Errore: File non trovato"
exit2# Il codice di uscita personalizzato 2 indica che il file non è stato trovato.
fiSe qualcuno esegue il tuo script e fallisce, può fare riferimento al codice di uscita per determinare l’errore esatto. In questo esempio, il codice di uscita 1 segnala che l’utente non ha fornito un argomento richiesto, mentre il codice di uscita 2 indica esplicitamente che il file non è stato trovato. Questo approccio strutturato è particolarmente utile quando il tuo script fa parte di un sistema più grande o quando un altro script dipende dalla sua uscita.
Elenco dei codici di uscita comuni
Sebbene diversi programmi possano definire i propri codici di uscita, ci sono alcuni schemi comuni che vedrai in molti strumenti da riga di comando, specialmente nei sistemi Linux e simili a Unix. Ecco alcuni dei più frequentemente incontrati:
- 0: Tutto va bene! Il programma è stato eseguito senza problemi.
- 1: Qualcosa è andato storto, ma l’errore non è specifico. Questo è come il catch-all dei codici di uscita.
- 2: Uso improprio delle built-in della shell. Questo può verificarsi se utilizzi un comando in modo errato, come dimenticare parametri richiesti.
- 126: Il comando esiste, ma non hai il permesso di eseguirlo.
- 127: Comando non trovato. Questo significa che il comando non esiste o non è nel percorso del sistema. Controlla di nuovo l’ortografia.
- 128: Argomento di uscita non valido. Hai usato un numero che non ha senso come codice di uscita.
- 130: Programma terminato da Ctrl + C. Questo accade quando interrompi manualmente un programma.
- 137: Condizione di esaurimento della memoria (OOM).
- 255: Il programma ha cercato di restituire un codice di uscita al di fuori dell’intervallo valido.
Alcuni programmi specifici hanno i propri codici di uscita unici. Ad esempio, grep restituisce 0 quando trova corrispondenze, 1 quando non trova alcuna corrispondenza e 2 quando c’è un errore. Inoltre, gli sviluppatori possono tecnicamente utilizzare quasi qualsiasi numero (di solito da 0 a 255 nei sistemi simili a Unix).
Collegare i comandi in base al successo o al fallimento
Bash fornisce anche due operatori utili && e || che ti permettono di concatenare comandi a seconda che il precedente sia riuscito o fallito:
- && (operatore AND): Esegue il comando successivo solo se quello precedente ha avuto successo (codice di uscita 0).
- || (operatore OR): Esegue il comando successivo solo se quello precedente è fallito (codice di uscita diverso da zero).
Ad esempio, supponiamo che tu voglia creare una directory e poi immediatamente accedervi. Se la creazione della directory fallisce o l’accesso non funziona, potresti voler visualizzare un messaggio di errore:
mkdir new_directory &&cd new_directory ||echo"Impossibile creare e accedere alla directory"Qui, mkdir new_directory prova a creare la cartella. Se funziona, il codice esegue immediatamente cd new_directory. Se uno dei due passaggi fallisce, l’operatore || interviene e stampa il messaggio di errore.
Considerazioni finali
I codici di uscita possono sembrare un piccolo dettaglio, ma fanno parte di ciò che rende così potenti gli strumenti da riga di comando. Creano un linguaggio comune per i programmi per comunicare riguardo al successo e al fallimento, il che è essenziale per costruire sistemi complessi.
Se sei nuovo nel lavoro da riga di comando, inizia a prendere l’abitudine di controllare echo $? quando i comandi non si comportano come previsto. Presto, utilizzerai i codici di uscita nei tuoi script e apprezzerai questo semplice ma efficace sistema di comunicazione.