A questão da jqnecessidade de um filtro explícito quando a saída é redirecionada é discutida em toda a web. Mas não consigo redirecionar a saída se fizer jqparte de uma cadeia de tubulação, mesmo quando um filtro explícito estiver em uso.
Considerar:
touch in.txt
tail -f in.txt | jq '.f1'
# in a different terminal:
echo '{"f1":1,"f2":2}' >> in.txt
echo '{"f1":3,"f2":2}' >> in.txt
Como esperado, a saída no terminal original do jqcomando é:
1
3
Mas se eu adicionar qualquer tipo de redirecionamento ou canalização ao final do jqcomando, a saída ficará silenciosa:
rm in.txt
touch in.txt
tail -f in.txt | jq '.f1' | tee out.txt
# in a different terminal:
echo '{"f1":1,"f2":2}' >> in.txt
echo '{"f1":3,"f2":2}' >> in.txt
Nenhuma saída aparece no primeiro terminal e o out.txt está vazio.
Eu tentei centenas de variações, mas é uma questão ilusória. A única solução alternativa que encontrei , como foi descoberta na mosquitto_subThe Things Network (onde também descobri o problema), é agrupar as funções tail e jq em um script de shell:
#!/bin/bash
tail -f $1 | while IFS='' read line; do
echo $line | jq '.f1'
done
Então:
./tail_and_jq.sh | tee out.txt
# in a different terminal:
echo '{"f1":1,"f2":2}' >> in.txt
echo '{"f1":3,"f2":2}' >> in.txt
E com certeza, a saída aparece:
1
3
Isto é com o mais recente jqinstalado via Homebrew:
$ echo $SHELL
/bin/bash
$ jq --version
jq-1.5
$ brew install jq
Warning: jq 1.5_3 is already installed and up-to-date
Isso é um bug (em grande parte não documentado) no jqou com meu entendimento das correntes de tubulação?
tail -f logfile | grep 'foo bar' | awk ...
tailsurgiu dos esforços para quebrar o canal (execute o primeiro comando, tee e redirecione para arquivo, siga-o, canalize para o próximo comando, redirecione para arquivo, etc.) e execute-o continuamente em seções. A <é uma boa ferramenta para se ter em mente.
tail -fpara fornecer entrada contínua a um programa eteeprocessar a saída. Se você ainda precisasse de uma resposta, eu sugeriria simplificar a cadeia para<in.json jq '.f1' >out.jsonque você pudesse restringir o que está causando isso.