Por que o dedo não possui um valor de retorno diferente de zero?

0

Costumo usar o valor de retorno / status de um comando em scripts. Estou curioso porque o comando finger não tem um valor de retorno.

Por exemplo,

$ finger kevin
Login: klang                 Name: Kevin Kang
etc...                       Shell: /bin/bash
No mail.
No Plan.

$ echo $?
0

$ finger blabla
finger: blabla: no such user.

$ echo $?
0

Testado no Ubuntu e RH. Eu acho que eu poderia fazer algum processamento de string e procurar a resposta "no such user", mas isso parece complicado.

A página man não lista nenhum valor de retorno.

Sim, sim, ele tem um valor de retorno zero, mas isso não é útil se esse for o valor somente que ele possui - não sabia que tinha que soletrar isso de verdade.

    
por Levon 27.10.2017 / 00:57

3 respostas

2

finger não considera que uma situação não encontrada vale um código de retorno diferente de zero.

Existem no entanto casos de erros reais como:

$ finger -x
finger: invalid option -- 'x'
usage: finger [-lmps] [login ...]
$ echo $?
1

A alteração do comportamento finger seria trivial, modificando seu código-fonte, mas isso não foi feito provavelmente para não quebrar os scripts que esperam que o dedo nunca falhe.

Eu tenho medo que você tenha que continuar com o resultado do pós-processamento para alcançar sua meta se precisar ficar com finger .

Como alternativa, você pode usar getent , que fornece um valor de retorno útil:

$ getent passwd root
root:x:0:0:root:/root:/bin/bash
$ echo $?
0
$ getent passwd foo
$ echo $?
2
    
por 27.10.2017 / 01:30
2

finger não é POSIX-specified , portanto, as implementações são livres para manipular códigos de retorno da maneira que quiserem. Parece que a maioria das distribuições Linux copiou uma versão BSD do pacote.

Para o Ubuntu, o link leva a um arquivo .bz2 contendo o código-fonte para finger.c . Esse código mostra apenas dois lugares onde retorna algo diferente de zero:

  • se você inserir uma opção inválida (como jlliagre já apontou ).

  • se a rotina calloc não conseguir encontrar um valor inteiro de memória livre (na função userlist) - improvável

Caso contrário, a função main retorna incondicionalmente zero.

    
por 27.10.2017 / 02:34
0

Ele possui um código de retorno. Você não pode não ter um código de retorno. É simplesmente que finger está em seus testes sempre retornando 0 . 0 não é 'sem código de retorno'.

    
por 27.10.2017 / 01:09