2016年3月23日
curlとWgetの比較
curl vs Wget
(2016-03-03)by Daniel Stenberg
本記事は、原著者の許諾のもとに翻訳・掲載しております。
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 と比較した方がよいとのご意見をもらいましたが、全く別のツールないしはプロジェクトのため、ここでは比較の対象にしていません。
同様の機能を備えた優れたツールとして aria2 と axel (もしかしたらプロジェクトとしては終了しているかもしれません)の2つを挙げることができます。ぜひ試してみてください。
機能ごとの厳密な比較に関しては、 curl比較表 を参照してください(同様の機能を備えたツールとの比較も記載しています)。
謝辞
フィードバックや手直しをしてくれた、Micah CowanとOlemis Langに感謝します。
監修者
古川陽介
株式会社リクルート プロダクト統括本部 プロダクト開発統括室 グループマネジャー 株式会社ニジボックス デベロップメント室 室長 Node.js 日本ユーザーグループ代表
株式会社リクルート プロダクト統括本部 プロダクト開発統括室 グループマネジャー 株式会社ニジボックス デベロップメント室 室長 Node.js 日本ユーザーグループ代表
複合機メーカー、ゲーム会社を経て、2016年に株式会社リクルートテクノロジーズ(現リクルート)入社。
現在はAPソリューショングループのマネジャーとしてアプリ基盤の改善や運用、各種開発支援ツールの開発、またテックリードとしてエンジニアチームの支援や育成までを担う。
2019年より株式会社ニジボックスを兼務し、室長としてエンジニア育成基盤の設計、技術指南も遂行。
Node.js 日本ユーザーグループの代表を務め、Node学園祭などを主宰。
- Twitter: @yosuke_furukawa
- Github: yosuke-furukawa