curlとWgetの比較

curlとWgetの主な違いについて著者(Daniel Stenberg)の私見を述べています。自分の子どもとも言えるcurlをひいきしていますが、Wgetにも携わっているので、思い入れがないわけではありません。

この記事に関するご感想やご意見をお寄せください。

問題点や改善点があると思われる場合は、Issueやpull-requestを発行してください。

共通点

  • FTPやHTTP、HTTPSからコンテンツをダウンロードできるコマンドラインツールです。
  • HTTP POSTリクエストを送信できます。
  • HTTPクッキーをサポートしています。
  • スクリプトの中で使用したりできるよう、ユーザインタラクションがなくても動作するようにデザインされています。
  • 完全なオープンソースで、無料のソフトウェアです。
  • 開発プロジェクトとして90年代に立ち上げられました。
  • metalinkをサポートしています。

相違点

curl

  • ライブラリ。curlは誰もが使用できるlibcurlと呼ばれるクロスプラットフォームライブラリの安定したAPIによって提供されています。これはWgetと大きく異なる点で、内部処理方法に対するアプローチが全く異なります。さらに、「ただの」コマンドラインツールより、ライブラリを作成する方が若干難しいでしょう。
  • パイプ。curlは伝統的なUnixのcatコマンドに近い動作をします。標準出力でより多くのものを送信し、標準入力でより多くのものを読み取る「全てパイプである」スタイルです。それに比べWgetはLinuxスタイルのcpコマンドに近いだけでなく、同じcpをコマンドに使用します。
  • シングルショット。curlでは一発でデータ転送を実行します。ユーザ指定のURLのみを転送し、再帰的なダウンロードのロジックやHTMLパーサの類いは含まれません
  • プロトコルが多い。curlがサポートするのは、FTP、FTPS、Gopher、HTTP、HTTPS、SCP、SFTP、TFTP、TELNET、DICT、LDAP、LDAPS、FILE、POP3、IMAP、SMB/CIFS、SMTP、RTMP、RTSPです。しかし、WgetがサポートするのはHTTP、HTTPS、FTPのみです。
  • 移植性が高い。curlはWgetより多くのプラットフォーム上でビルド、実行されています。例えば、OS/400やTPF、その他多くのunixクローンとは言えない「特殊な」プラットフォームで構築、実行されています。
  • より多くのSSLライブラリとSSLサポート。curlは11の異なるSSL/TLSライブラリのいずれかで構築することができ、制御しやすく、プロトコルの詳細について幅広いサポートを提供しています。curlは公開鍵ピンニングをサポートしています。
  • HTTP認証。curlはWgetより多くのHTTP認証方法をサポートしています。特にBasicやDigest、NTLM、NegotiateなどHTTPプロキシを経由するものをサポートしています。
  • SOCKS。curlでは、プロキシアクセスに対応したSOCKSプロトコルバージョンを複数サポートしています。
  • 双方向性。curlでは、アップロードと送信の機能を提供しています。WgetではHTTP POSTのサポートのみを提供しています。
  • HTTPマルチパートフォームデータ送信を行うため、ユーザはHTTPを「アップロード」することができます。通常ブラウザをエミュレートして、より広い範囲でHTTPを自動化します。
  • curlでは、gzipおよびContent-Encoding形式での暗号化、自動展開をサポートしています。
  • curlでは、Transfer-Encoding HTTPで展開を実行してくれます。Wgetでは提供していません。
  • curlでは、HTTP/2をサポートし、Happy Eyeballsを使用したデュアルスタック接続形態を取っています。
  • 開発活動がより活発。これには議論の余地がありますが、次の3つを判断材料としています。メールリストの投稿数、ソースコードのコミット頻度、そしてリリース頻度です。2つのプロジェクトを追っている人であれば、curlプロジェクトの方がこの3点において、Wgetよりも活動があることが分かっていると思います。しかも、かれこれ10年以上もこの状態が継続しています。openhubで比較

Wget

  • Wgetはコマンドラインのみで、ライブラリはありません。
  • 再帰的。getがcurlと比べて特に優れている機能は、再帰的にダウンロードしたり、HTMLページやFTPディレクトリのリストのようなものでも参照先を全てたどってダウンロードすることもできることです。
  • 古い。Wgetの歴史は1995までさかのぼりますが、curlは1996末にまでしかさかのぼることができません。
  • GPL。Wgetは100パーセントGPL v3ライセンスです。curlはMITライセンスになります。
  • GNU。WgetはGNUプロジェクトの一部であり、著作権はすべてFSF(フリーソフトウェア財団)に帰属します。curlはプロジェクトとしても組織としても完全に独立しており、ほぼ全ての著作権がDaniel(私)に帰属します。
  • Wgetでは、単にリモートURLからローカルファイルにダウンロードするだけであれば追加のオプションは必要ありません。しかし、curlでは「-o」や「-O」コマンドが必要となります。
  • Wgetでは、SSL/TLSのためにサポートしているのは、GnuTLSあるいはOpenSSLのみです
  • Wgetでは、Basic認証のみをHTTPプロキシ認証方式としてサポートしています。
  • Wgetでは、SOCKSサポートを提供していません。
  • Wgetには、転送断から回復し、ダウンロードを継続する機能がありますが、curlには存在しません。
  • Wgetでは、多くの機能がデフォルトで有効設定されています。例えば、クッキー、リダイレクト、リモートソースからのタイムスタンプなど。curlでは、これらを有効にする必要があります。
  • Wgetは、左手のみを使用するQWERTY配列だけで入力することができます。

さらに

アップロード機能をwputと比較した方がよいとのご意見をもらいましたが、全く別のツールないしはプロジェクトのため、ここでは比較の対象にしていません。

同様の機能を備えた優れたツールとしてaria2axel(もしかしたらプロジェクトとしては終了しているかもしれません)の2つを挙げることができます。ぜひ試してみてください。

機能ごとの厳密な比較に関しては、curl比較表を参照してください(同様の機能を備えたツールとの比較も記載しています)。

謝辞

フィードバックや手直しをしてくれた、Micah CowanとOlemis Langに感謝します。