Как использовать `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'