curlのconfigである.curlrcwrite-out = "\n"を書くと便利、ということが書きたいが、.curlrcの前に-wオプションについて書いてから話を進めたい。

-w, --write-out <format>

curlの-wオプションは、データ転送が終わった後にオプションで指定したものを表示してくれる。

%{http_code}

一番使われるケースは、シェルスクリプト中で、curlした結果のHTTPステータスだけ取得したいときではないか。

-o /dev/nullと合わせて-w'%{http_code}'を使うと、200だけが取得できる

curl https://... -w'%{http_code}' -s -o /dev/null

改行

HTTPステータスのみ取得のように強い動機があるわけではないが、-w'\n'で改行を最後に表示させるのは日常の使い勝手の面で重要になる。

curlした時、レスポンスボディの最後に改行がなく、コンソールの表示が崩れることがよくある。

例えばGoogleでは、以下のようにコンソールの$がレスポンスボディの最後の</html>の直後に来てしまう。

$ curl -s https://www.google.com/ | tail -c 30
/script>        </body></html>$

-w'\n'で改行を最後に表示させれば、この問題は解決する。

$ curl -s -w'\n' https://www.google.com/ | tail -c 30
script>        </body></html>
$

リダイレクトと-o, --output <file>

冒頭で「curlの-wオプションは、データ転送が終わった後にオプションで指定したものを表示してくれる」と記載したが、レスポンスデータをいじるのではなく、データ転送が終わった後に追加で出力しているだけなので、リダイレクト(もしくはパイプ)と-o, --output <file>ではファイルに出力される文字に違いが出る。

リダイレクトの方は、curlの結果全てが出るので、-w'\n'をつけて実行したとすれば、ファイルの最後には改行が含まれる。

対して-o, --output <file>の方は、転送されたレスポンスボディのデータのみをファイルに書き出すので、-w'\n'をつけて実行しても、ファイルの最後に改行が含まれない。

やはり改行を末尾に追加することが日常使いには便利

-w, --write-out <format>について以下の3点について書いた。

  • -w'%{http_code}'でよく使う
  • -w'\n'で末尾に改行を追加すればコンソールの使い勝手が上がる
  • 改行を加えてもリダイレクトか-o, --output <file>で違いが出る

一番言いたかったのは「末尾に改行を追加すればコンソールの使い勝手が上がる」という部分で、本題の.curlrcに入る前に書きたかった。

.curlrc

curlには、--config <file>(短縮オプションは-K)でファイルに記載した各種オプションを読み込んで実行する機能がある。

--configオプションで指定しなくても、.curlrcがあればデフォルトで読み込んでくれるため、PCのホームディレクトリに.curlrcファイルを置いておくといい。

どのような設定を書くべきか → 控えめにした方がよさそう

.curlrcにどのような設定を書くは個人の自由。

ただチームで開発している場合は、あまり凝った設定を書くとコマンドラインをコピペして共有しても他の人のPC上では動かない、ということになってしまったりする。

控えめに使用する方がいいと思う。

改行を末尾に追加する

そこで、-w, --write-out <format>で書いてきた「末尾に改行を追加すればコンソールの使い勝手が上がる」という部分から始めるのがいいと思う。

$ vim ~/.curlrc

$ cat ~/.curlrc
write-out = "\n"

このように設定すると、毎回-w'\n'を指定しなくても、末尾に改行を追加してくれる。

この程度の設定であれば、他の人にコマンドを共有しても他の人のPCでは動かないというレベルにはならない。

改行なしでファイルに出力したいのであれば、「リダイレクトと-o, --output <file>」で書いたとおり、-o, --output <file>オプションを使えばいいし、.curlrcの設定がこれしかなければ、次に書くように.curlrcの設定を読み込まないようにすればいい。

-q, --disable.curlrcを読み込まない

-qオプションをつければ.curlrcを読み込まない。

ただし注意点として、-qをcurlの一番最初のパラメータとして渡さなければいけない。

$ curl -q https://www.google.com/