web-dev-qa-db-ja.com

シェルパイプラインで `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を使用できるようにするには、どうしたらこの動作を防ぐことができますか?


(この例には 猫の無用な使い方 が含まれていることに気付きました。これは説明のためだけのものです)

169
mgalgs

引数としてフィルタを提供する必要があります。 jqがデフォルトで提供するプリティプリント以外の変更されていないものを介してJSONを渡すには、アイデンティティーフィルタ.を使用します。

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

私がよくやっているユースケースの1つとして、"curlなどの他のシェルコマンドに渡すJSONデータを作成するにはどうすればよいですか?"--null-input/-nオプションを使用する方法があります。

入力をまったく読んではいけません。代わりに、フィルタは入力としてnullを使用して1回実行されます。これは、単純な計算機としてjqを使用する場合、またはJSONデータを最初から作成する場合に役立ちます。

そしてそれをcurlに渡す例:

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