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

Puoi risolvere i problemi più velocemente con i codici di uscita di 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$?

Mostrando i codici di uscita dell'ultimo comando eseguito

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.  
fi

Quando 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.  
fi

Se 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.