Como posso usar o valor de um pipe no programa de teste?

7
wc -l | test -eq 1

Isso não funciona. Eu quero comparar o resultado de wc com o valor de 1. Como posso fazer isso?

    
por tr3quart1sta 15.08.2013 / 16:38

2 respostas

6

Ele não responde à sua pergunta sobre pipes, mas você pode reorganizar:

test $(ls -l | wc -l) -eq 1 && echo "worked"

E há algumas soluções em SO , sendo este o mais bonito:

ls -l | wc -l | { read wc; test $wc -eq 7 && echo "woohoo"; }
    
por Oli 15.08.2013 / 16:43
2

Se você estiver usando o Bash, provavelmente desejará pesquisar a variável PIPESTATUS. Conforme observado no guia de referência do Bash , o PIPESTATUS é

  

Uma variável de matriz (consulte Matrizes) contendo uma lista de valores de status de saída dos processos no pipeline de primeiro plano executado mais recentemente (que pode conter apenas um único comando).

Podemos descobrir quais foram os códigos de saída para este pipeline com o PIPESTATUS:

dmesg | grep -iw 'nnse' | wc -l

Se você agora consulta a variável array, você obtém os status de saída referentes aos comandos usados no pipeline:

echo ${PIPESTATUS[@]}
0 1 0

(Em uma matriz indexada, os códigos de saída acima são representados por 0 1 e 2 na matriz, pois as matrizes sempre começam em 0 no Bash.)

Aqui vemos que o segundo comando retornou 1 e o resto 0; no entanto, wc -l retornará 0 se houver correspondência zero, o que não é um erro. A falha é representada com um valor diferente de zero e há outros valores de erro, como 127, que é o comando não encontrado, e ainda mais códigos que podem ser específicos do programa em questão.

Se você quiser ver qual foi o código de saída de um determinado comando no pipeline, basta acessar esse valor. O comando grep foi o segundo comando no pipeline acima, mas como as matrizes começam em 0, precisamos da entrada um.

Então, para descobrir o código de saída do comando grep, execute o pipeline acima novamente (pois o conteúdo do PIPESTATUS terá esgotado se você executou echo ${PIPESTATUS[@]} ) e execute o comando abaixo, que retornará 1 (a saída código):

echo ${PIPESTATUS[1]}
1

Em um script, verifique se o pipeline concluiu a execução antes de procurar o conteúdo da variável de matriz PIPESTATUS.

Para um exemplo de uso interessante da variável de matriz PIPESTATUS, consulte esta resposta sobre a combinação do agrupamento de comandos Bash e o status do pipe . Você poderia testar a variável array da maneira sugerida por Gilles nos comentários, embora primeiro seja necessário executar o pipeline novamente:

dmesg | grep -iw 'nnse' | wc -l
[ ${PIPESTATUS[1]} -eq 1 ] && do_something_here

Este é apenas um fragmento, já que não sei que tipo de script você está pretendendo, mas espero que o conhecimento sobre o PIPESTATUS possa ser de alguma utilidade para você. Existem muitas variáveis do array Bash, como o PIPESTATUS, que podem ser extremamente úteis; veja o guia de referência do Bash para a lista completa, e os outros sites do Stackexchange para exemplos de seu uso.

    
por user76204 15.08.2013 / 19:15

Tags