我想下载一个文件获得,但按照通常的 UNIX 哲学,我不希望它输出任何事物如果下载成功,则显示错误消息。但是,如果下载失败,则显示错误消息。
该-q
选项会抑制所有输出,包括错误消息。如果我改为包含-nv
选项,Wget 仍会打印(在 stderr 上):
2012-05-03 16:17:05 URL:http://example.net/ [2966] -> "index.html" [1]
我怎样才能删除该输出但仍然收到错误消息?
答案1
请尝试curl
:
curl -fsS $url -o $file
长版本:
curl --fail --silent --show-error $url --output $file
GNOME 用户可以尝试 Gvfs:
gvfs-cp $url $file
答案2
如果你得不到更好的答案,那么就使用蹩脚的黑客技术:
wget {url} 2>/tmp/err.log || cat /tmp/err.log; rm /tmp/err.log
(2> /tmp/err.log 将 stderr 重定向到 tmp 文件;如果 wget 返回 0 [成功],则 || 短路,否则它将打印出错误日志值)
答案3
由于目前所有 wget 输出都转到 stderr,因此要以“优雅的方式”解决这个问题,似乎必须修补 wget 源。
wget 源设计规定了消息之间的详细程度差异,而不是错误和非错误消息之间的简单划分。
有一个关于此问题的未解决的错误http://savannah.gnu.org/bugs/?33839,还有一些较早的讨论。这是一个建议的补丁http://www.mail-archive.com/wget%40sunsite.dk/msg03289.html以下是 Hrvoje Niksic 对此的回答http://www.mail-archive.com/wget%40sunsite.dk/msg03330.html。
除此之外,当然还有您在评论中针对 Foon 不太优雅的解决方案提出的好的解决方案。
答案4
实现您想要的最简单的语法是
wget <url> 2>&1 | grep ERROR
例子
$ wget https://google.com/ 2>&1 | grep ERROR #this gives no output
$ wget https://google.com/randomstring 2>&1 | grep ERROR
2020-11-20 11:36:30 ERROR 404: Not Found.
解释
2>&1
将 stderr 重定向到 stdout 以捕获wget
的输出grep ERROR
禁止输出除字符串“ERROR”之外的所有行