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