
Quero saber quais valores de retorno podemos usar que não serão confundidos com ex. SIGINT?
ex.:
$sleep 10
$#hit ctrl+c
$echo $?
130
então eu sei que não devo usar nada parecido return 130
ouexit 130
então isso seria enganoso:
$function FUNC(){ return 130; };FUNC;echo $?
130
Responder1
O status de saída de um processo é codificado como um valorentre 0 e 255, então isso é tudo que você pode usar como código de saída. Se você passar um valor fora desse intervalo, a maioria dos shells usará o módulo restante 256. Alguns shells permitem um intervalo mais amplo de valores inteiros para funções.
A única regra para códigos de saída é que0 significa sucesso e qualquer outro valor significa fracasso. Essa regra vai além do Unix: também é uma convenção comum em outros sistemas operacionais (incluindo DOS, Windows e muitos sistemas embarcados que possuem noção de código de saída, mas o VMS faz as coisas de maneira diferente). Em sistemas unix, ele é incorporado às construções booleanas do shell ( if
, while
, &&
, ||
, !
, set -e
, …), make
e seguido por todos os utilitários padrão. Em programas POSIX C,EXIT_SUCCESS
é 0 e EXIT_FAILURE
é algum valor diferente de zero (geralmente 1).
Não existe nenhuma regra (de fato ou de jure) quanto à escolha dos códigos de saída para falha. Apenas alguns utilitários POSIX exigem códigos de status de falha específicos:
- O
!
operador shell retorna 1 se seu operando retornar 0. O operador&&
and||
passa o status do último comando. cmp
ediff
retorne 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ãofind
, 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 pedaço 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
elocaledef
defina alguns valores pequenos para erros específicos.
Existe uma ideia comum, mas não universal, de que valores maiores significam fracassos piores. Para comandos que testam uma condição booleana como grep
(esse padrão está presente?) e diff
(esses arquivos são idênticos?), 1 significa “não” e valores mais altos indicam um erro. Além disso,valores de 126 para cima raramente são usados, à medida que são incorporados ao shell (e aos comandos POSIX command
, env
, nice
, nohup
e time
):
- 126 e 127 indicam uma falha ao invocar um comando externo;
- valores acima de 128 in
$?
indicam um comando que foi finalizado por um sinal.
/usr/include/sysexits.h
lista alguns valores com seus significados, mas é do sendmail e nunca vi isso fora de programas que não estejam relacionados à entrega de e-mail.
Em resumo, retorne 0 para sucesso e 1 ou 2 para falha. Se precisar distinguir entre casos de falha, comece em 1 e aumente o valor para falhas piores.
Responder2
Convenções de status de saída
Tecnicamente, você pode usar qualquer valor entre 0 e 255. No entanto, existem várias convenções existentes que você pode usar:
- Código de saída 1 como umpega-tudo para erros gerais.
- Códigos de saída 64-78 desysexits.hpara indicar a classe de erro. Geralmente você pode procurá-los em/usr/include/sysexits.h, que é instalado pelo pacote Debian/Ubuntu libc6-dev.
- Códigos de saída deerrno.h. Você também pode pesquisá-los com oerrnocomando do pacote moreutils. No meu sistema, a execução
errno --list
atualmente exibe 134 erros definidos.
Documento e exibição
Em geral, é uma boa ideia documentar os códigos de saída usados no seu script, ou pelo menos qual convenção você está seguindo. Também pode ser útil exibir uma mensagem distinta antes de sair, como:
# using sysexits.h
echo "EX_USAGE: invalid argument: $1" > /dev/stderr
exit 64
# using errno.h
echo "ENOENT: File not found: $file" > /dev/stderr
exit 2
Responder3
Você pode usar qualquer número entre 0 e 255, excetocódigos de saída reservados(Clique aqui para saber mais)