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

2

Eu quero saber quais valores de retorno podemos usar que não serão confundidos por ex. SIGINT?

ex .:

$sleep 10
$#hit ctrl+c
$echo $?
130

então sei que não devo usar nada como return 130 ou exit 130

então isso seria enganoso:

$function FUNC(){ return 130; };FUNC;echo $?
130
    
por Aquarius Power 15.11.2014 / 19:55

3 respostas

3

Você pode usar qualquer número entre 0 e 255, exceto os códigos de saída reservados ( clique aqui para saber mais )

    
por 15.11.2014 / 20:19
6

O status de saída de um processo é codificado como um valor entre 0 e 255 , de modo que é tudo o que você pode usar como um código de saída. Se você passar um valor fora desse intervalo, a maioria dos shells usa o restante do módulo 256. Alguns shells permitem um intervalo maior de valores inteiros para funções.

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). Em 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 (de fato ou de jure) em relação à escolha de códigos de saída para falha. Apenas alguns utilitários POSIX exigem códigos de status de falha específicos:

  • O operador ! shell retornará 1 se o operando retornar 0. O operador && e || transmitirá o status do último comando.
  • 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 (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 , pois eles são incorporados ao shell (e comandos POSIX command , env , nice , nohup e time ):

  • 126 e 127 indicam uma falha ao invocar um comando externo;
  • Valores
  • acima de 128 em $? indicam um comando que foi finalizado por um sinal.

/usr/include/sysexits.h lista alguns valores com seus significados, mas é do sendmail e eu nunca o vi fora de programas que não estão relacionados à entrega de e-mail.

Em resumo, retorne 0 para sucesso e 1 ou 2 para falha. Se você precisar distinguir entre casos de falha, comece em 1 e aumente o valor para falhas piores.

    
por 16.11.2014 / 00:10
3

Sair das convenções de status

Tecnicamente, você pode usar qualquer valor entre 0 e 255. No entanto, existem várias convenções existentes que você pode usar:

  • Saia do código 1 como um bom para erros gerais .
  • Saia dos códigos 64-78 de sysexits.h para indicar a classe de erro. Você pode geralmente procurar em /usr/include/sysexits.h , que é instalado pelo pacote Debian / Ubuntu libc6-dev.
  • Saia dos códigos de errno.h . Você também pode procurá-los com o comando errno do pacote moreutils. No meu sistema, a execução de errno --list exibe atualmente 134 erros definidos.

Documento e exibição

Em geral, é uma boa ideia documentar os códigos de saída usados no script ou, pelo menos, a convenção que 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
    
por 16.11.2014 / 04:24