用过Linux和命令行的人可能都知道Wget和Curl,很多码农可能都用Curl写过程序,但是要说两者的区别可能很多人说不上了。本文我们对两者进行一个比较。
共同点
两者都是命令行工具,可以从FTP,HTTP和HTTPS下载内容。
两者都可以发送HTTP,POST请求。
都支持HTTPcookie。
两者都设计为无需用户交互即可工作。
两者都是完全开源和免费的软件。
这两个项目恰好都诞生在上世纪90年代。
都支持metalink。
功能差异
Curl优势
library:curl底层由libcurl提供支持。libcurl是一个具有稳定API的跨平台库,可以被其他工具和语言调用,所以Curl具有很强大编程性质,由很多语言的打包,很多语言的HTTP(S)功能(比如PHP)都是由libcurl提供。
管道:curl的工作方式更像传统的Unixcat命令,它将更多的内容发送到stdout,并且从stdin中读取更多内容。Wget行为更像是cp命令。
单发:Curl基本上是做数据的单发传输。它仅传输用户指定的URL,不包含任何递归下载逻辑或任何类型的HTML解析器。
支持更多协议:Curl支持FTP(S),Gopher,HTTP(S),SCP,SFTP,TFTP,TELNET,DICT,LDAP(S),MQTT,FILE,POP3(S),IMAP(S),SMB/CIFS,SMTP(S),RTMP和RTSP。而Wget仅仅支持HTTP(S)和FTP。
更具可移植性:Curl可以在wget之外的更多平台上构建和运行。例如:OS/,TPF和其他Unix系OS。
更多的SSL库和SSL支持:curl可以使用十三个不同的SSL/TLS库之一来构建,它可以提供更多控制权并更广泛地支持协议详细信息。
HTTP身份验证:curl支持更多的HTTP身份验证方法,尤其是通过HTTP代理:Basic,Digest,NTLM和Negotiate
SOCKS:curl支持SOCKS4和SOCKS5用于代理访问。使用基于本地或代理的名称解析。
双向交互:curl提供上传和发送功能。Wget仅提供简单的HTTPPOST支持。
HTTP多部分/表单数据发送,它允许用户执行HTTP上载并通常模拟浏览器并在更大范围内执行HTTP自动化。
curl支持gzip,brotli,zstd和deflateContent-Encoding并可以自动解压缩。
curl提供并执行对Transfer-EncodedHTTP的解压缩,而wget不支持。
curl支持HTTP/2,HTTP/3,Alt-svc,并且使用HappyEyeballs进行双堆栈连接。
curl支持并发传输(-Z)。
curl开发社区更活跃,openhub上对两个项目的对比:
curl在macOS和Windows10上预装的。Wget需要自己手动安装。
Wget优势
Wget仅是命令行工具,不提供类库。
递归下载:与curl相比,Wget的主要优势在于它具有递归下载功能,甚至可以递归下载资源引用的所有内容,包括HTML页面链接,以及FTP目录列表。
历史年代:Wget的历史可以追溯到年,而Curl可以追溯到年底。
GPL:Wget的软件协议遵循GPLv3。curl是MIT协议。
GNU:Wget是GNU项目的一部分,所有权利归FSF自由软件基金会。Curl项目完全是独立的的个人项目,所有权利归创始人Daniel。
Wget不需要其他选项即可简单地将远程URL下载到本地文件,而curl需要-o或-O。
Wget仅支持GnuTLS或OpenSSL以支持SSL/TLS。
Wget仅支持基本HTTP身份验证唯一的身份验证类型。
Wget不支持SOCKS。
Wget具有很强大的断点续传功能。
Wget默认启用更多功能:Cookie,重定向,远程资源的时间戳等等。在Curl下,大多数这些功能都需要用命令行显式开启。
总结
两者对比Curl更具有编程性,更适合开发用,而Wget的下载功能更强。近年来,致力于用Wget2替换wget。具有相似功能集的其他两个功能强大的工具还包括aria2和axel(已经好久未更新项目),更详细的功能对比,可参考Curl官方的功能对比。