Как использовать `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 в конвейере?


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

Ответ 1

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

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

Ответ 2

В одном случае, который я часто делал, я также делаю: "Как мне создать данные 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'