Status de saída diferente de zero para saída limpa

14

É aceitável retornar um código de saída diferente de zero se o programa em questão foi executado corretamente? Por exemplo, digamos que eu tenha um programa simples que (apenas) faça o seguinte:

O programa leva N argumentos. Retorna um código de saída de min (N, 255). Note que qualquer N é válido para o programa.

Um programa mais realista pode retornar códigos diferentes para programas executados com sucesso, que significam coisas diferentes. Esses programas devem, em vez disso, gravar essas informações em um fluxo, como stdout?

    
por Thomas Eding 22.06.2012 / 22:11
fonte

7 respostas

23

Depende do ambiente, mas eu diria que é um estilo ruim.

Sistemas Unix-like têm uma strong convenção de que um status de saída de 0 denota sucesso, e qualquer status de saída diferente de zero denota falha. Alguns programas, mas não todos, distinguem entre diferentes tipos de falhas com diferentes códigos de saída diferentes de zero; por exemplo, grep normalmente retorna 0 se o padrão foi encontrado, 1 se não foi e 2 (ou mais) se houve um erro, como um arquivo ausente.

Esta convenção é bastante difícil em shells Unix. Por exemplo, em sh , bash e outras shells parecidas com Bourne, a instrução if trata um status de saída 0 como success / true e um status de saída diferente de zero como failure / false:

if your-command
then
    echo ok
else
    echo FAILURE
fi

Eu acredito que as convenções no MS Windows são semelhantes.

Agora, certamente não há nada que impeça você de criar seu próprio programa que use códigos de saída não convencionais, especialmente se nada mais for interagir, mas esteja ciente de que está violando uma convenção bem estabelecida e volte e morda você mais tarde.

A maneira usual de um programa retornar esse tipo de informação é imprimi-lo em stdout :

status = $(your-command)
echo Result is $status
    
por 22.06.2012 / 22:36
fonte
6

Depende do que seu ambiente espera.

Meu favorito para wierdness, da Wikipedia :

In OpenVMS, success is indicated by odd values and failure by even values. The value is a 32 bit integer with sub-fields: control bits, facility number, message number and severity. Severity values are divided between success (Success, Informational) and failure (Warning, Error, Fatal).

    
por 22.06.2012 / 22:29
fonte
4

Acho que há um precedente se o código de saída estiver retornando informações importantes e relevantes para o chamador e a definição de sucesso não for realmente binária. O precedente em que estou pensando é o robocopy que retorna uma série de coisas diferentes dependendo do que aconteceu .

Acrescentarei que sempre acabamos tendo alguma depuração por causa disso - a maioria dos utilitários supõe que o código de saída 0 == seja bem-sucedido, então fique assustado quando o robocopy retornar 1 porque ele copiou as coisas não zero porque não copiou mas também não recebeu um erro.

    
por 23.06.2012 / 13:29
fonte
2

não retornar 0 para uma execução bem-sucedida é uma má ideia, pois pode causar confusão para quem executa seu programa. E se alguns executassem seu programa mais de 100 vezes com entradas diferentes e quisessem saber quantos falharam ou foram concluídos com sucesso, ter um único valor de sucesso torna isso muito mais fácil de detectar diferenças do que ter muitos valores diferentes.

Se você tem um programa que tem vários caminhos de retorno bem-sucedidos que podem significar coisas diferentes, eu diria que é um sinal de que seu programa está mal projetado.

    
por 22.06.2012 / 22:37
fonte
2

Eu conheço um caso que considero aceitável. Eu conheço uma estrutura de teste que sai com o número total de falhas de teste. Portanto, por exemplo, se o executor de testes for concluído sem testes com falha, ele sairá com zero. Se um teste falhou, mesmo que o próprio corredor de teste tenha funcionado adequadamente, ele sai com um 1. Se dois falharem, ele retornará 2, etc. Isso aumentará para 250, o que significa "250 ou mais falhas de teste".

Ele usa códigos de saída > 250 para significar saídas anormais.

Embora isso viole a convenção, funciona bem na prática.

    
por 23.06.2012 / 01:07
fonte
2

Isso realmente depende do que você está tentando transmitir com o código. O DB2, por exemplo, retorna 100 se não houver dados encontrados, vários outros valores positivos para avisos e valores negativos para erros. A Oracle faz algo semelhante.

Portanto, se houver diferentes estados de sucesso, pode valer a pena usar valores de retorno variáveis.

    
por 23.06.2012 / 07:27
fonte
2

Um bom exemplo: man sa update (spamassassin)

CÓDIGOS DE SAÍDA

  • Um código de saída 0 significa que uma atualização estava disponível e foi baixada e instalada com êxito se --checkonly não foi especificado.
  • Um código de saída 1 significa que não há atualizações novas disponíveis.
  • Um código de saída de 2 significa ...

Nesse caso, a saída 1 é simplesmente um código informativo. No entanto, se eu tivesse escrito o código, não teria escolhido 1, uma vez que normalmente falha na rede elétrica.

    
por 30.03.2015 / 20:09
fonte