Como obtenho a lista de códigos de saída (e / ou códigos de retorno) e significado para um comando / utilitário?

10

Existe uma maneira de fazer o que foi indicado no título a partir dos comandos do terminal, ou terei que examinar os códigos?

    
por precise 22.01.2014 / 08:14

4 respostas

11

Não há "receita" para obter os significados de um status de saída de um determinado comando de terminal.

Minha primeira tentativa seria a manpage:

user@host:~# man ls 
   Exit status:
       0      if OK,

       1      if minor problems (e.g., cannot access subdirectory),

       2      if serious trouble (e.g., cannot access command-line argument).

Segundo : Google . Veja wget como um exemplo.

Terceiro : os status de saída do shell, por exemplo, bash. O Bash e seus builtins podem usar valores acima de 125 especialmente. 127 para o comando não encontrado, 126 para o comando não executável. Para obter mais informações, consulte os códigos de saída do bash .

    
por 22.01.2014 / 08:46
7

Você terá que examinar o código / documentação. No entanto, o que mais se aproxima de uma "padronização" é errno.h

    
por 22.01.2014 / 08:35
6

Os códigos de saída indicam uma condição de falha ao finalizar um programa e ficam entre 0 e 255. O shell e seus builtins podem usar especialmente os valores acima de 125 para indicar modos de falha específicos, portanto a lista de códigos pode variar entre shells e sistemas operacionais (por exemplo, Bash usa o valor 128 + N como status de saída). Veja: Bash - 3.7.5 Exit Status ou man bash .

Em geral, um status de saída a zero indica que um status de saída bem-sucedido , não indica falha .

Para verificar qual código de erro é retornado pelo comando, você pode imprimir $? para o último código de saída ou ${PIPESTATUS[@]} , o que fornece uma lista de valores de status de saída de pipeline (no Bash) depois que um script de shell termina.

Não há uma lista completa de todos os códigos de saída que podem ser encontrados, mas houve uma tentativa de sistematizar os números de status de saída na fonte do kernel, mas isso é destinado principalmente para programadores C / C ++ e padrões semelhantes para scripts podem ser apropriados .

Algumas listas de sysexits no Linux e no BSD / OS X com códigos de saída preferidos para programas (64-78) podem ser encontradas em /usr/include/sysexits.h (ou: man sysexits no BSD):

0   /* successful termination */
64  /* base value for error messages */
64  /* command line usage error */
65  /* data format error */
66  /* cannot open input */
67  /* addressee unknown */
68  /* host name unknown */
69  /* service unavailable */
70  /* internal software error */
71  /* system error (e.g., can't fork) */
72  /* critical OS file missing */
73  /* can't create (user) output file */
74  /* input/output error */
75  /* temp failure; user is invited to retry */
76  /* remote error in protocol */
77  /* permission denied */
78  /* configuration error */
/* maximum listed value */

A lista acima aloca os códigos de saída anteriormente não utilizados de 64-78. O intervalo de códigos de saída não alocados será ainda mais restrito no futuro.

No entanto, os valores acima são usados principalmente no sendmail e usados por praticamente ninguém, então eles não são nada remotamente próximos a um padrão (como apontado por @ Gilles ).

No shell, o status de saída é o seguinte (com base no Bash):

  • 1 - 125 - O comando não foi concluído com êxito. Verifique na página man do comando o significado do status, alguns exemplos abaixo:

  • 1 - Catchall para erros gerais

    Miscellaneous errors, such as "divide by zero" and other impermissible operations.

    Exemplo:

    $ let "var1 = 1/0"; echo $?
    -bash: let: var1 = 1/0: division by 0 (error token is "0")
    1
    
  • 2 - Uso indevido de builtins do shell (de acordo com a documentação do Bash)

    Missing keyword or command, or permission problem (and diff return code on a failed binary file comparison).

    Exemplo:

     empty_function() {}
    
  • 6 - Nenhum dispositivo ou endereço desse tipo

    Exemplo:

    $ curl foo; echo $?
    curl: (6) Could not resolve host: foo
    6
    
  • 124 - tempo limite de comando

  • 125 - se um comando falhar veja: coreutils
  • 126 - se o comando for encontrado mas não puder ser chamado (por exemplo, não é executável)

    Permission problem or command is not an executable.

    Exemplo:

    $ /dev/null
    $ /etc/hosts; echo $?
    -bash: /etc/hosts: Permission denied
    126
    
  • 127 - se um comando não puder ser encontrado, o processo filho criado para executá-lo retornará esse status

    Possible problem with $PATH or a typo.

    Exemplo:

    $ foo; echo $?
    -bash: foo: command not found
    127
    
  • 128 - Argumento inválido para exit

    exit takes only integer args in the range 0 - 255.

    Exemplo:

    $ exit 3.14159
    -bash: exit: 3.14159: numeric argument required
    
  • 128 - 254 - sinal de erro fatal "n" - o comando morreu devido a um sinal recebido. O código de sinal é adicionado a 128 (128 + SIGNAL) para obter o status (Linux: man 7 signal , BSD: man signal ), alguns exemplos abaixo:

  • 130 - comando terminado devido ao pressionamento de Ctrl-C, 130-128 = 2 (SIGINT)

    Exemplo:

    $ cat
    ^C
    $ echo $?
    130
    
  • 137 - se o comando receber o sinal KILL(9) (128 + 9), o status de saída do comando, caso contrário

    kill -9 $PPID of script.

  • 141 - SIGPIPE - escreva em um pipe sem leitor

    Exemplo:

    $ hexdump -n100000 /dev/urandom | tee &>/dev/null >(cat > file1.txt) >(cat > file2.txt) >(cat > file3.txt) >(cat > file4.txt) >(cat > file5.txt)
    $ find . -name '*.txt' -print0 | xargs -r0 cat | tee &>/dev/null >(head /dev/stdin > head.out) >(tail /dev/stdin > tail.out)
    xargs: cat: terminated by signal 13
    $ echo ${PIPESTATUS[@]}
    0 125 141
    
  • 143 - comando terminado pelo código de sinal 15 (128 + 15 = 143)

    Exemplo:

    $ sleep 5 && killall sleep &
    [1] 19891
    $ sleep 100; echo $?
    Terminated: 15
    143
    
  • 255 * - status de saída fora do intervalo.

    exit takes only integer args in the range 0 - 255.

    Exemplo:

    $ sh -c 'exit 3.14159'; echo $?
    sh: line 0: exit: 3.14159: numeric argument required
    255
    

According to the above table, exit codes 1 - 2, 126 - 165, and 255 have special meanings, and should therefore be avoided for user-specified exit parameters.

Observe que valores de saída fora do intervalo podem resultar em códigos de saída inesperados (por exemplo, a saída 3809 fornece um código de saída de 225, 3809% 256 = 225).

Veja:

por 12.01.2016 / 00:54
1

Até onde eu sei, existem apenas dois, mais ou menos, valores padrão - ambos definidos em stdlib.h para uso com exit ():

  • EXIT_SUCCESS (= 0)
  • EXIT_FAILURE (= 1)

E o único valor padrão de fato, ou seja, ter o mesmo significado para todos os programas do mundo, é 0 (zero), que significa SUCESSO.

Programas diferentes introduzem listas diferentes de códigos de "falha" retornados para distinguir ou enfatizar erros diferentes (tipos diferentes ou gravidade). Alguns programas até usam o valor retornado para relatar o número inteiro de erros de tempo de execução descobertos (por exemplo, o número de testes de unidade com falha no processo).

Eu não recomendaria a introdução de qualquer tipo de "novo padrão" estendendo o stdlib.h

    
por 17.03.2017 / 00:34