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: