Por que o bc sai 0 ao dividir por 0?

3

Eu estava tentando pensar em uma maneira rápida e ilustrativa de gerar um status de saída não bem-sucedido e pensei em dividir por zero com o bc seria uma boa ideia.

Fiquei surpreso ao descobrir que, embora ele gere um erro de tempo de execução, o status de saída ainda é 0:

$ echo 41 + 1 | bc
42
$ echo $?
0
$ echo 42/0 | bc
Runtime error (func=(main), adr=6): Divide by zero
$ echo $?
0
  • Por que o utilitário bc não falha com um status de saída diferente de zero?

Observação: para um status de saída rápido diferente de zero, estou usando return 1

Além disso, de dicas sobre o shell :

$ expr 1 / 0
expr: division by zero
$ echo $?
2
    
por mbigras 04.04.2017 / 02:18

2 respostas

7
As implementações

bc diferem um pouco no status de retorno, mas a ideia geral é que, se você fornecer uma entrada válida, bc sai com o status 0. 42/0 é uma entrada válida: não há erro de leitura e é até mesmo uma expressão sintaticamente válida, portanto bc retorna 0. Se você passou uma segunda linha com outra operação, bc a executaria. Isso é diferente de expr cuja finalidade é avaliar uma única expressão aritmética; aqui o resultado dessa única expressão determina o status de retorno.

A maneira mais direta de gerar um status de saída que indica falha é chamar false . Coisas como expr 1 / 0 só têm o seu lugar em concursos de programação ofuscados.

    
por 05.04.2017 / 03:06
7

Veja a especificação ; este é o comportamento esperado.

Toda a entrada foi lida corretamente por bc , então produziu o status de saída 0.

Se você executar bc em um arquivo inexistente, como bc nosuchfile , você receberá outro status de saída.

Para ilustrar um status de saída diferente de zero, eu compararia ls somefile e ls nosuchfile , ou mostraria como os status de saída 1 e 2 são usados convencionalmente (1 para erro esperado ou status de falha, 2 para erro inesperado ) assim:

$ echo hello > file1
$ echo hello > file2
$ echo goodbye > file3
$ cmp -s file1 file2
$ echo $?
0
$ cmp -s file1 file3
$ echo $?
1
$ cmp -s file1 file4
$ echo $?
2
$ 
    
por 04.04.2017 / 02:30