curl-wget ベン図
(daniel.haxx.se)- wget は curl の直接的な競合相手ではなく、作業に応じて併用できる 一部の機能が重なるツール と見るべき
- 選択基準はツールの好みではなく、作業を終えるのにより適しているか であり、wget のほうが適しているなら wget を使えばよい
- curl と wget の技術的な違いと重なる領域をひと目で分かるように ベン図 で整理しており、フル解像度の画像も提供されている
- 両プロジェクトは対立関係ではなく、curl 側から wget にコードを貢献しており、複数の wget メンテナー も curl に貢献したことがある
- 図の誤りや抜けは更新される可能性があり、別の比較文書やダウンロードツール比較表でより詳しく確認できる
curl と wget を見る基準
- wget は curl の競合相手というより 補完的なツール に近い
- 2 つのツールは一部の機能が重なるが、重要なのは特定のツールにこだわることではなく、解決したい作業 に合った選択をすること
- ある状況で wget のほうが作業を終えるのに適しているなら、wget を使うのがよい
ベン図で整理した違い
- curl と wget の間の 技術的な違い と一部の類似点を視覚的に示すために、ベン図を作成した
- 図の画像はクリックするとフル解像度版を見られる
- 問題や抜けている項目が見つかったら知らせてほしいとしており、必要なら図を更新できる
プロジェクト間の協力
- curl 側から wget にコードを貢献したことがある
- 複数の wget メンテナー も curl に貢献したことがある
- 両プロジェクトの関係は、競争や対立よりも協力に近い
さらに見る価値のある比較資料
- curl vs wget: curl と wget の比較文書
- Compare curl with other download tools: curl と他のダウンロードツールの比較表
- OpenHub’s curl vs wget table: OpenHub の curl-vs-wget 比較表
1件のコメント
Hacker News のコメント
Wget 側には少なくとも 合理的なデフォルト設定、レジューム、エラー時のリトライも入れるべきだと思う
最近、不安定な接続で非常に大きなファイルを受信するスクリプトを書く必要があったが、エンジニアの間での共通認識は、この種の作業には Wget を使うべきというものだった
curl も試したが、デフォルト状態ではレジュームやリトライが効かず、マニュアルを読んで複数のオプションや引数を指定する必要があった。こうした動作はデフォルトで有効になっているべきだと感じる
Wget はクラッシュ後まで含めて、あらゆる状況でレジュームを有効にするのに
--continueオプション 1 つで済み、マニュアルの紹介にも、遅いまたは不安定なネットワークで堅牢に動作するよう設計されており、ダウンロードが失敗した場合はファイル全体を受け取るまで再試行し続けると書かれているcurl でも悪い接続で信頼性高く動くようにすべてのオプションを調整することはできるだろうが、Wget はそのようなデフォルト動作がすでに有効になっているように見えるので、自分で試せていない障害状況でも期待どおりに動くと信じやすい。HTTP プロトコルが更新されても、新しい Wget ならデフォルトで対応する可能性があるが、curl は改善された動作を有効にするために新しいスイッチが必要になるかもしれず、製品リリース後には追加できない
私にとって curl は素晴らしく非常に多用途な 低レベルツール であり、CLI もその性格を反映しているが、日常作業では Wget のほうがデフォルト状態ではるかによく動くので好んでいる。マニュアルもより早く読み流せるが、それはおそらく、ここで言及されている難解なプロトコル群をすべてサポートしていないからだろう
wget urlだけで URL をダウンロードして保存するという点だけでも、コマンドライン利用では Wget に軍配が上がると思うcurlにもまさにその機能がある。レジュームは-Cフラグで、リトライは--retryがある個人的には curl のデフォルトもかなり合理的だと感じるし、curl のようなツールでそのどちらかがデフォルトで有効になっていてほしいとは思わない
-iも追加すべきだ特に
wget -i -は標準入力から読むので、パイプラインでとても便利だcurl は私の知る限りこれができない。普通は
xargsを使えと言われるが、URL がすべて到着するまで待ってから curl を実行するため、URL 生成コマンドとダウンロードコマンドの間の並列性を捨てることになり、代替としてはいまひとつだ以前にマニュアルを読んでいたとしても、欲しいフラグを正確に覚えているのは簡単ではなく、生成されたコマンドラインを検証するほうが、マニュアルを読みながら一から組み立てるよりたいてい手間が少ない
現代の Web では、自作スクリプトで Puppeteer のようなツールを使うほうが簡単なこともある。特にインタラクティブなサイトが JavaScript を多用しているならなおさらだ
たとえば
$ curl -sSLOJ 'example.com/file name.txt'はcurl: (3) URL using bad/illegal format or missing URLというエラーになり、$ curl -sSLOJ 'example.com/file%20name.txt'はfile%20name.txtというファイルを作る一方 wget は追加フラグなしでどちらの URL でも
"file name.txt"というファイルを作る。ただし、この例の URL は 404 なので、厳密には wget に--content-on-errorも付ける必要がある多くの人にとっての核心的な違いは、おそらく デフォルトで標準出力に書くツール と デフォルトでファイルを作るツール の違いだろう
shにパイプできるツール ;-)私にとって Wget の決定的な機能は、デフォルトで URL から導出したファイル名 でファイルをダウンロードすることだ
wget url://to/file.htmを実行すると、現在の作業ディレクトリに"file.htm"というファイルができるcurl では
curl url://to/file.htm > file.htmのように書くか、それより不便な別の呪文を使う必要があるcurl -Ohttps://curl.se/docs/manpage.html#-O
wget "url://to/file.htm?uid=foo&q=bar&rnd=4"のようなケースがあるcurl -Oのほうが便利だその「決定的機能」を
catにたとえると、cat file.htmlがcat file.html > file.htmlに変わるようなものだ。そうなると、実際にはコピーではなく出力したいときにcat file.html -o -のようなものを書かなければならず、curl にそういう機能がなくてよかったと思うDaniel Stenberg は、自分の創作物に 心血を注ぐ 稀有な開発者の部類に入る
現代のビッグテックでは、影のような開発者たちが金を生む機械の交換可能な歯車のように見え、そのような特性は次第に失われつつあるように思える
彼は curl を、IT 世界に残す自分の足跡のように扱っているようだ
もちろん最近では、実際に技術的にも優れていることが多く、選択はさらに容易になっている
この比較は少し古いようだ。たとえば、図で Wget 側に以下の 2 つが抜けている
HTTP PUTはwget --method=PUT --body-data=で可能で、プロキシと HTTPS もwget --use-proxy=on --https_proxy=[https://example.com](<https://example.com>)のように使えるcurl のほうが一貫してオプション数も柔軟性も上だが、ベン図の右側にある項目のうち Wget でもある程度可能なものはいくつかある
へえ、curl がこれほど多くの プロトコル をサポートしているとは知らなかった。それでも小さな共通部分こそ、おそらく curl/Wget ユーザーの 90% 以上が実際に使う部分だろう
開発者の観点では重なりはそれほど大きくないが、ユーザーの観点ではずっと大きく見えるかもしれない
記事でいちばん良かった部分はこの一文だ
「私は wget にコードを寄稿したことがある。何人かの wget メンテナーも curl に寄稿した。私たちは皆友人だ。」
Daniel Stenberg が作った比較も必見だ
https://daniel.haxx.se/docs/curl-vs-wget.html
昔は Web サイトを ミラーリング したいときに Wget を使っていた。Wget は特化型ツールだ
curl は CLI フロントエンド付きの汎用リクエストライブラリで、他のプログラムに組み込まれたり、PHP などの標準ライブラリ API のように使われたりもする
最も一般的な使い方は、たぶん両者の重なる部分だろう。だから、それぞれのツールがどの オペレーティングシステムと Docker イメージ にデフォルトでインストールされているかを示すベン図を見てみたい