Masalah jqmemerlukan filter eksplisit ketika output diarahkan kembali dibahas di seluruh web. Tapi saya tidak dapat mengarahkan output jika jqmerupakan bagian dari rantai pipa, bahkan ketika filter eksplisit sedang digunakan.
Mempertimbangkan:
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
Seperti yang diharapkan, output di terminal asli dari jqperintah adalah:
1
3
Tetapi jika saya menambahkan segala jenis pengalihan atau pemipaan ke akhir jqperintah, hasilnya menjadi sunyi:
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
Tidak ada output yang muncul di terminal pertama dan out.txt kosong.
Saya sudah mencoba ratusan variasi tetapi ini masalah yang sulit dipahami. Satu-satunya solusi yang saya temukan , seperti yang ditemukan melalui mosquitto_subdan The Things Network (yang merupakan tempat saya juga menemukan masalah), adalah untuk membungkus fungsi ekor dan jq dalam skrip shell:
#!/bin/bash
tail -f $1 | while IFS='' read line; do
echo $line | jq '.f1'
done
Kemudian:
./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
Dan benar saja, output muncul:
1
3
Ini dengan yang terbaru jqdiinstal melalui 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
Apakah ini bug (sebagian besar tidak berdokumen) di jqatau dengan pemahaman saya tentang rantai pipa?
tail -f logfile | grep 'foo bar' | awk ...
tailbit muncul dari upaya untuk memecah pipa (jalankan perintah pertama, tee dan redirect ke file, ekor itu, pipa ke perintah berikutnya, redirect ke file, dll) dan jalankan terus menerus dalam beberapa bagian. Ini <adalah alat yang baik untuk diingat.
tail -funtuk memberikan input terus menerus ke suatu program danteeuntuk memproses output. Jika Anda masih membutuhkan jawaban, saya akan menyarankan untuk menyederhanakan rantai<in.json jq '.f1' >out.jsonsehingga Anda dapat mempersempit apa yang menyebabkannya.