Проблема jq
необхідності явного фільтра під час перенаправлення виводу обговорюється в усьому Інтернеті. Але я не в змозі перенаправити вихід, якщо він jq
є частиною ланцюга труб, навіть коли використовується явний фільтр.
Поміркуйте:
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
Як і очікувалося, вихід у вихідний термінал з jq
команди:
1
3
Але якщо я додати до кінця jq
команди будь-яке перенаправлення чи конвеєр , результат вимкнеться:
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
У першому терміналі не з'являється вихід, а out.txt порожній.
Я спробував сотні варіантів, але це невловиме питання. Єдине вирішення, яке я знайшов , як було виявлено через " mosquitto_sub
The Things Network" (саме там я також виявив проблему), - це загортати хвіст і функції jq у сценарій оболонки:
#!/bin/bash
tail -f $1 | while IFS='' read line; do
echo $line | jq '.f1'
done
Потім:
./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
І досить впевнено, з'являється вихід:
1
3
Це найновіше, jq
встановлене через 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
Це (в основному незадокументована) помилка jq
чи з моїм розумінням трубних ланцюгів?
tail -f logfile | grep 'foo bar' | awk ...
tail
біт виник через зусиль, щоб розбити трубу вниз (запустіть першу команду, трійник і перенаправлення на файл, хвіст, що перейдіть до наступної команди, переадресуйте на файл тощо) і запустіть її постійно в секціях. Хоча <
це є гарним інструментом, про який потрібно пам’ятати.
tail -f
яке забезпечує постійне введення програми таtee
обробку результатів. Якщо ви все ще потребували відповіді, я б запропонував спростити ланцюжок до<in.json jq '.f1' >out.json
того, щоб ви могли звузити те, що це викликає.