Quais valores de retorno/saída posso usar em funções/scripts bash?

Quais valores de retorno/saída posso usar em funções/scripts bash?

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 130ouexit 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, …), makee 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.
  • cmpediffretorne 1 para arquivos diferentes e ≥2 para condições de erro.
  • exprretorna 1 se a expressão for avaliada como zero ou nula, 2 para uma expressão inválida e ≥3 para outros erros.
  • grepretorna 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).
  • mesgretorna 0 para sim, 1 para não e ≥2 para erro.
  • patchretorna 1 se um pedaço foi rejeitado e ≥2 para outros erros.
  • sort -cretorna 1 se os dados do arquivo não estiverem classificados e ≥2 para erros.
  • compresselocaledefdefina 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, nohupe 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.hlista 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 --listatualmente 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)

informação relacionada