usando “ifne” no cachimbo Bash

1

No meu script, estou usando o utilitário ifne do pacote moreutils . A linha pode ser simplificada para o seguinte:

printf "asdf\n" | ifne cat - && echo "stream not empty"

ifne só é executado se o fluxo não for emty. Mas como posso fazer o segundo comando (echo "stream not empty") também executar somente se não vazio? Como está agora, no próximo caso o eco é executado (mas eu não quero que ele seja executado):

printf "" | ifne cat - && echo "stream not empty"

usando parênteses me dá um erro de sintaxe:

printf "" | ifne (cat - && echo "stream not empty")

Como posso executar o último comando apenas se o fluxo não estiver vazio?

    
por Martin Vegter 11.07.2014 / 10:25

2 respostas

2

ifne não define um código de saída com base no fato de a entrada estar vazia ou não, portanto, && e || não funcionarão como esperado. Uma abordagem alternativa à resposta de Babyy é usar pee do mesmo pacote:

printf "asdf\n" | pee 'ifne cat -' 'ifne echo "stream not empty"'

Isso funciona como tee , mas duplica o fluxo de entrada em vários canais, tratando cada argumento como um comando a ser executado. ( tpipe é um comando similar, mas se comporta de maneira ligeiramente diferente.)

Um possível problema é que cada um dos comandos pode estar gravando em stdout em paralelo, dependendo do buffer e do comprimento da entrada / saída, há uma chance de que a saída seja intercalada ou varie de corrida para execução (efetivamente uma corrida ). Isso provavelmente pode ser eliminado usando sponge (mesmo pacote) em vez de cat e / ou outras soluções buffering / unbuffering . Isso afeta o exemplo que você deu, mas pode não afetar seu caso de uso real.

    
por 11.07.2014 / 11:28
7

Use este formato:

printf ""     | ifne sh -c  "cat - ; echo 'stream not empty' "

A saída é nenhuma e:

printf "bb\n" | ifne sh -c  "cat - ; echo 'stream not empty' "

A saída é:

bb
stream not empty
    
por 11.07.2014 / 10:48