GNU/Linux >> Linux Esercitazione >  >> Linux

Esistono codici di stato di uscita standard in Linux?

'1' :Catch-all per errori generali

'2' :Uso improprio dei built-in della shell (secondo la documentazione di Bash)

'126' :il comando richiamato non può essere eseguito

'127' :"comando non trovato"

'128' :Argomento non valido per uscire

'128+n' :Segnale di errore irreversibile "n"

'130' :Script terminato da Ctrl + C

'255' :Stato di uscita fuori intervallo

Questo è per Bash. Tuttavia, per altre applicazioni, esistono codici di uscita diversi.


Parte 1:Guida avanzata agli script Bash

Come sempre, la Advanced Bash Scripting Guide contiene ottime informazioni:(Questo è stato collegato in un'altra risposta, ma a un URL non canonico.)

1: Catchall per errori generali
2: Uso improprio dei built-in della shell (secondo la documentazione di Bash)
126: Il comando richiamato non può essere eseguito
127: "comando non trovato"
128: Argomento non valido per uscire
128+n: Segnale di errore fatale "n"
255: Stato di uscita fuori intervallo (l'uscita accetta solo argomenti interi nell'intervallo 0 - 255)

Parte 2:sysexits.h

L'ABSG fa riferimento a sysexits.h .

Su Linux:

$ find /usr -name sysexits.h
/usr/include/sysexits.h
$ cat /usr/include/sysexits.h

/*
 * Copyright (c) 1987, 1993
 *  The Regents of the University of California.  All rights reserved.

 (A whole bunch of text left out.)

#define EX_OK           0       /* successful termination */
#define EX__BASE        64      /* base value for error messages */
#define EX_USAGE        64      /* command line usage error */
#define EX_DATAERR      65      /* data format error */
#define EX_NOINPUT      66      /* cannot open input */    
#define EX_NOUSER       67      /* addressee unknown */    
#define EX_NOHOST       68      /* host name unknown */
#define EX_UNAVAILABLE  69      /* service unavailable */
#define EX_SOFTWARE     70      /* internal software error */
#define EX_OSERR        71      /* system error (e.g., can't fork) */
#define EX_OSFILE       72      /* critical OS file missing */
#define EX_CANTCREAT    73      /* can't create (user) output file */
#define EX_IOERR        74      /* input/output error */
#define EX_TEMPFAIL     75      /* temp failure; user is invited to retry */
#define EX_PROTOCOL     76      /* remote error in protocol */
#define EX_NOPERM       77      /* permission denied */
#define EX_CONFIG       78      /* configuration error */

#define EX__MAX 78      /* maximum listed value */

8 bit del codice di ritorno e 8 bit del numero del segnale di uccisione vengono mescolati in un unico valore al ritorno da wait(2) &co..

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <signal.h>

int main() {
    int status;

    pid_t child = fork();
    if (child <= 0)
        exit(42);
    waitpid(child, &status, 0);
    if (WIFEXITED(status))
        printf("first child exited with %u\n", WEXITSTATUS(status));
    /* prints: "first child exited with 42" */

    child = fork();
    if (child <= 0)
        kill(getpid(), SIGSEGV);
    waitpid(child, &status, 0);
    if (WIFSIGNALED(status))
        printf("second child died with %u\n", WTERMSIG(status));
    /* prints: "second child died with 11" */
}

Come stai determinando lo stato di uscita? Tradizionalmente, la shell memorizza solo un codice di ritorno a 8 bit, ma imposta il bit alto se il processo è stato terminato in modo anomalo.

$ sh -c 'exit 42'; echo $?
42
$ sh -c 'kill -SEGV $$'; echo $?
Segmentation fault
139
$ expr 139 - 128
11

Se vedi qualcosa di diverso da questo, probabilmente il programma ha un SIGSEGV gestore di segnale che poi chiama exit normalmente, quindi in realtà non viene ucciso dal segnale. (I programmi possono scegliere di gestire qualsiasi segnale oltre a SIGKILL e SIGSTOP .)


Nessuna delle risposte precedenti descrive correttamente lo stato di uscita 2. Contrariamente a quanto affermano, lo stato 2 è ciò che effettivamente restituiscono le tue utilità della riga di comando quando vengono chiamate in modo improprio. (Sì, una risposta può avere nove anni, avere centinaia di voti positivi ed essere ancora sbagliata.)

Ecco la convenzione sullo stato di uscita reale e di vecchia data per la terminazione normale, ovvero non tramite segnale:

  • Stato di uscita 0:successo
  • Exit status 1:"failure", come definito dal programma
  • Exit status 2:errore di utilizzo della riga di comando

Ad esempio, diff restituisce 0 se i file confrontati sono identici e 1 se differiscono. Per convenzione di vecchia data, i programmi unix restituiscono exit status 2 quando vengono chiamati in modo errato (opzioni sconosciute, numero errato di argomenti, ecc.) Ad esempio, diff -N , grep -Y o diff a b c risulteranno tutti in $? impostato su 2. Questa è ed è stata la pratica sin dai primi giorni di Unix negli anni '70.

La risposta accettata spiega cosa succede quando un comando viene terminato da un segnale. In breve, la terminazione a causa di un segnale non rilevato comporta lo stato di uscita 128+[<signal number> . Ad esempio, terminazione tramite SIGINT (segnale 2) risulta nello stato di uscita 130.

Note

  1. Diverse risposte definiscono lo stato di uscita 2 come "Uso improprio dei built-in bash". Questo si applica solo quando bash (o uno script bash) esce con lo stato 2. Consideralo un caso speciale di errore di utilizzo errato.

  2. In sysexits.h , menzionato nella risposta più popolare, stato di uscita EX_USAGE ("errore di utilizzo della riga di comando") è definito come 64. Ma questo non riflette la realtà:non sono a conoscenza di alcun utilità Unix comune che restituisce 64 in caso di chiamata errata (esempi benvenuti). Un'attenta lettura del codice sorgente rivela che sysexits.h è ambizioso, piuttosto che un riflesso del vero utilizzo:

     *    This include file attempts to categorize possible error
     *    exit statuses for system programs, notably delivermail
     *    and the Berkeley network.
    
     *    Error numbers begin at EX__BASE [64] to reduce the possibility of 
     *    clashing with oth­er exit statuses that random programs may 
     *    already return. 
    

    In altre parole, queste definizioni non rispecchiano la pratica comune dell'epoca (1993) ma erano intenzionalmente incompatibili con essa. Altro è il peccato.


Linux
  1. Linux:come scoprire se ci sono file in una cartella ed uscire di conseguenza (in Ksh)?

  2. Linux:i valori minimo e massimo dei codici di uscita in Linux?

  3. Linux:esistono delle GUI per Linux che non utilizzano X11?

  4. Esistono programmi come COM0COM in Linux?

  5. C'è STDCALL in Linux?

Linux – I diversi kernel Linux/unix sono intercambiabili?

Con Fedora 36, ​​potrebbe esserci un nuovo gold standard per le distribuzioni Linux

Cosa sono i codici di uscita Bash in Linux

Esiste un equivalente WinSCP per Linux?

Esistono distribuzioni Linux moderne che supportano ancora /dev/audio?

Ci sono GUI per Linux che non usano X11?