Как использовать `jq` в конвейере оболочки?

Я не могу получить jq вести себя "нормально" в оболочке конвейера. Например:

$ curl -s https://api.github.com/users/octocat/repos | jq | cat

результаты в jq просто распечатывая текст справки *. То же самое происходит, если я пытаюсь перенаправить jqвывод в файл:

$ curl -s https://api.github.com/users/octocat/repos | jq > /tmp/stuff.json

Является jq умышленно выручать, если он решает, что он не запускается из tty? Как я могу предотвратить это поведение, чтобы я мог использовать jq в трубопроводе?


* (Я понимаю, что этот пример содержит бесполезное использование кошки; это только для иллюстрации)

2 ответа

Решение

Вы должны предоставить фильтр в качестве аргумента. Чтобы передать JSON через немодифицированное, отличное от красивой печати jq по умолчанию используется фильтр идентификации .:

curl -s https://api.github.com/users/octocat/repos | jq '.' | cat

Один случай использования, который я часто выполняю, - это "Как создать данные JSON для передачи в другие команды оболочки, например curl " Я делаю это, используя --null-input/-n опция:

Не читайте никаких входных данных вообще! Вместо этого фильтр запускается один раз, используя null в качестве входа. Это полезно при использовании jq в качестве простого калькулятора или для создания данных JSON с нуля.

И пример передачи его в curl:

jq -n '{key: "value"}' | curl -d @- \
  --url 'https://some.url.com' \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json'
Другие вопросы по тегам