Linux下cURL使用教程之十三:curl vs wget

curl和wget有很多地方是相同的,很多场景下二者都可以使用。那面对一个复杂问题的时候,我们怎么决定使用哪个工具呢?本篇通过对二者进行比较,从而对此提供思路。
本篇主要参考curl官方的文档,翻译加整理。

相同点

  • 都是可通过FTP/HTTP/HTTPS协议下载文件的命令行工具;
  • 都可以发送HTTP POST请求;
  • 都支持cookie的使用;
  • 都被设计为无界面(UI),可在如脚本中使用;
  • 都是开源且免费的软件。

不同点

curl

  • curl是基于libcurl库实现,因此特性来源于libcurl库。libcurl库跨平台、开源且免费,因此curl不只是一个命令行工具
  • 管道。curl在传统的UNIX风格的基础上加以扩展,对输入输出做出更多的处理,从而贯彻了”everything is a pipe” 的设计思想。
  • 单点传送(Single shot)。curl被设计为用于数据的单点传送。它只会传送用户指定的URLS,并不包含任何递归下载的逻辑,也不对html进行任何解析。
  • 更多协议支持。目前curl 支持的协议有: FTP, FTPS, HTTP, HTTPS, SCP, SFTP, TFTP, TELNET, DICT, LDAP, LDAPS, FILE, POP3, IMAP, SMTP 和 RTSP 。Wget仅仅支持 HTTP, HTTPS 和 FTP。(协议的支持情况可能会随着时间发展而变化。)
  • 更多平台支持,便于移植。与wget相比,curl可在更多平台上编译和运行。比如OS/400, TPF 和其他很多非UNIX的平台。
  • 更强大的SSL库和SSL支持。curl能应用于多个不同的 SSL/TLS 库, 并提供了更多的可控性和对协议细节更广泛的支持。
  • curl支持更多的HTTP认证方式。尤其是当你使用HTTP代理的时候,curl支持Basic, Digest, NTLM and Negotiate认证方式(参见HTTP认证模式)。
  • libcurl库支持多种不同的SOCKS代理,基于libcurl实现的curl工具也支持。而wget不支持。
  • 双向通信。 curl 提供了上传能力,Wget仅仅支持HTTP POST方式。
  • HTTP multipart/form-data 的发送能力。 这使得用户可以进行HTTP上传,更好的模拟浏览器的行为从而更大程度的实现HTTP操作的自动化,提供了更多操作的可能。
  • 压缩。 curl 支持GZIP和 inflate Content-Encoding 并且自动进行解压缩操作。
  • curl提供并执行Transfer-Encoded HTTP的解压缩,而wget不会
  • curl在7.27.0之后,提供对metalink的支持(好吧,百度百科对metalink的解释是不对的, 百度百科说的是oracle公司的一个服务)。而wget需要依靠一个Google Summer开源项目才能支持metalink。

wget

  • wget仅仅是一个命令行工具。没有库提供使用。
  • 递归下载支持。wget相比curl最大的优点在于对递归下载的支持,甚至下载一个资源如网页或FTP目录指向的所有资源。
  • wget下载时无需指定保存文件名。而curl需要使用-o或-O指定。
  • wget仅支持GnuTLS 和 OpenSSL两种SSL库。
  • wget仅支持HTTP代理的基本认证(Basic auth)。
  • wget不支持SOCKS代理。
  • wget项目更老,基于GPL开源协议,隶属GNU项目。curl基于MIT开源协议,不隶属于任何组织,版权由作者一人所有。

总结

wput仅是一个单独的工具,不进行讨论。
参考:curl vs Wget