Retorna 1 se a saída do comando estiver vazia sem capturá-lo

3

Eu tenho um shell script que termina com alguns pipes grep ... | while read ...| sort | uniq e eu quero retornar 1 se a saída estiver vazia, mas o uniq sempre retorna 0 mesmo que sua entrada esteja vazia.

Até agora, a melhor solução que encontrei é adicionar grep com um padrão vazio ... uniq | grep '' , isso funciona perfeitamente, mas parece mais um hack.

Então, minha pergunta é: Existe alguma maneira melhor / canônica de fazer isso?

Algumas restrições:

  • Eu não quero capturar minha saída em uma variável, já que eu precisaria imprimi-la novamente: a=$(... | uniq); printf '%s\n' "$a"; [ -n "$a" ] , o que também não parece certo.
  • Se possível, eu também prefiro uma ferramenta padrão (sem mais) e algo portátil

Obrigado!

    
por Quentin L'Hours 24.03.2018 / 19:10

2 respostas

1

Francamente, acho que | grep '' está ótimo. Você já usou um monte de programas no pipeline, então não é demais. E você já sabe o que o grep faz, portanto, não há depuração no que diz respeito a escrever um snippet de shell "inteligente" para fazê-lo.

Os comentários mencionados também são | grep . , o que pode ser outra possibilidade. grep . não corresponde em uma linha vazia, grep '' , então escolha dependendo de qual você deseja.

No entanto, usar grep como essa pode não ser imediatamente óbvio para um leitor casual, portanto, talvez você queira adicionar um comentário sobre sua finalidade em qualquer caso.

    
por 24.03.2018 / 20:45
0

Acho que isso deve funcionar:

[ -n "$(command | tee /dev/tty)" ]

tee enviará a saída de command para o stdout (onde é avaliado pelo comando test ) e seu terminal ( /dev/tty ), para que você possa ver a saída sem capturá-la em uma variável.

É uma solução AFAIK compatível com POSIX.

    
por 24.03.2018 / 19:33