curlの出力をteeで分岐する

curlの標準出力をteeに渡すと、レスポンスをファイルに保存しつつ、そのまま次のコマンドにも渡せる。

curl オプション URL | tee 保存先ファイル | 表示用コマンド
$ curl -s "https://httpbin.org/get?foo=bar" | tee response.json | jq .
{
  "args": {
    "foo": "bar"
  },
  "headers": {
    "Accept": "*/*",
    "Host": "httpbin.org",
    "User-Agent": "curl/7.88.1"
  },
  "origin": "1.21.115.218",
  "url": "https://httpbin.org/get?foo=bar"
}

画面にはjqで整形された内容が表示され、response.jsonにはレスポンスそのままの内容が保存される。

保存されるのは整形前の生データ

teejqより前で分岐しているため、response.jsonの中身は改行やインデントが加工される前の生のレスポンスになる。

$ cat response.json
{
  "args": {
    "foo": "bar"
  },
  ...
}

レスポンスをそのまま保存しておきたい場合や、後から別のツールで読み直したい場合はこの生データが役立つ。整形済みの内容を保存したい場合は、teejqの後ろに移動する。

$ curl -s "https://httpbin.org/get?foo=bar" | jq . | tee response.json

用途

APIのレスポンスを確認しながらデバッグする際、teeを挟んでおけば同じリクエストを再送せずに後から内容を見返せる。エラー発生時の切り分けにも使える。