Кажется, я не могу заставить 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; это для иллюстрации только для целей)

220
mgalgs 21 Окт 2015 в 00:35

2 ответа

Лучший ответ

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

curl -s https://api.github.com/users/octocat/repos | jq '.' | cat
340
chepner 20 Окт 2015 в 21:38

Один из вариантов использования, который я тоже часто выполняю, - это «Как мне создать данные 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'
17
mkobit 4 Апр 2017 в 20:25