A única regra para códigos de saída é que 0 significa sucesso e qualquer outro valor significa falha. Essa regra vai além do unix: também é uma convenção comum em outros sistemas operacionais (incluindo DOS, Windows e muitos sistemas incorporados que têm uma noção de código de saída, mas o VMS faz as coisas de maneira diferente). Nos sistemas Unix, ele é incorporado nas construções booleanas do shell ( if
, while
, &&
, ||
, !
, set -e
,…), em make
e seguido por todo o padrão Serviços de utilidade pública. Nos programas POSIX C, EXIT_SUCCESS
é 0 e EXIT_FAILURE
é algum não- valor zero (geralmente 1).
Não há regra ou convenção generalizada sobre a escolha de códigos de saída para falha. Apenas alguns utilitários POSIX exigem códigos de status de falha específicos:
-
cmp
e diff
retorna 1 para arquivos diferentes e ≥2 para condições de erro.
-
expr
retorna 1
se a expressão for avaliada como zero ou nula, 2 para uma expressão inválida e ≥3 para outros erros.
-
grep
retorna 1 para “não encontrado” e ≥2 para condições de erro. Muitos comandos de pesquisa seguem isso (mas não find
, que retorna 0 se nenhum arquivo corresponder).
-
mesg
retorna 0 para sim, 1 para não e ≥2 para erro.
-
patch
retorna 1 se um grupo foi rejeitado e ≥2 para outros erros.
-
sort -c
retorna 1 se os dados do arquivo não estiverem classificados e ≥2 para erros.
-
compress
e localedef
define alguns valores pequenos para erros específicos.
Existe uma ideia comum, mas não universal, de que valores maiores significam piores falhas. Para comandos que testam uma condição booleana como grep
(este padrão está presente?) E diff
(são esses arquivos idênticos), 1 significa “não” e valores mais altos indicam um erro. Além disso, os valores de até 126 são raramente usados, já que eles são incorporados no shell (e command
, env
, nice
, nohup
e time
): 126 e 127 indicam uma falha ao invocar um comando externo e valores acima de 128 em $?
indicam um comando que foi finalizado por um sinal. /usr/include/sysexits.h
é do sendmail e eu só vi isso seguido em sistemas de e-mail, especialmente por agentes de entrega de e-mail, como o procmail.
Muitos programas sempre retornam 1 ou sempre retornam 2 para qualquer falha. Acontece que iptables
define alguns códigos de erro diferentes.
Os valores de retorno mostrados por strace
são de chamadas de sistema . As chamadas do sistema retornam -1 para indicar um erro e armazenam o código de erro na variável errno
. Strace mostra o valor de errno
entre parênteses após o código de retorno. A distinção entre EACCES
("Permissão negada") e EPERM
("Operação não permitida") é um pouco sutil; a idéia geral é que EACCES
indica que as permissões no objeto de destino não permitem a ação, enquanto EPERM
indica algum outro problema de permissão (por exemplo, o objeto não pode ser acessado, ou a operação é restrita à raiz ).