web-dev-qa-db-fra.com

Comment utiliser `jq` dans un pipeline Shell?

Je n'arrive pas à obtenir que jq se comporte "normalement" dans un pipeline Shell. Par exemple:

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

résulte en jq en imprimant simplement son texte d'aide *. La même chose se produit si j'essaie de rediriger la sortie de jq vers un fichier:

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

Est-ce que jq renfloue délibérément s'il détermine qu'il ne s'agit pas d'un tty? Comment puis-je empêcher ce comportement afin que je puisse utiliser jq dans un pipeline?


(Je réalise que cet exemple contient un tilisation inutile de cat ; à des fins d'illustration uniquement)

174
mgalgs

Vous devez fournir un filtre en argument. Pour transmettre le fichier JSON par un fichier non modifié autre que la jolie impression jq fournit par défaut, utilisez le filtre d'identité .:

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

"Comment puis-je construire des données JSON pour les alimenter avec d'autres commandes Shell, par exemple curl?" ​​ Pour ce faire, utilisez l'option --null-input/-n:

Ne lisez aucune entrée du tout! Au lieu de cela, le filtre est exécuté une fois en utilisant null comme entrée. Ceci est utile lorsque vous utilisez jq comme simple calculatrice ou que vous construisez des données JSON à partir de rien.

Et un exemple le passant dans curl:

jq -n '{key: "value"}' | curl -d @- \
  --url 'https://some.url.com' \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json'
11
mkobit