wget 修改输出到 stdout,仅适用于 -q

wget 修改输出到 stdout,仅适用于 -q

我有一个用 Python 编写的最小 HTTP 服务器(http://pastebin.com/mjLDk7Gk) 只是用状态 200 和正文“Done”来回答每个 GET 请求。

如果我做

wget "http://localhost:9001" -O - -q
Done

但如果我省略 -q:

wget "http://localhost:9001" -O - 
--2015-01-12 15:28:20--  http://localhost:9001/
Resolving localhost (localhost)... 127.0.0.1
Connecting to localhost (localhost)|127.0.0.1|:9001... connected.
HTTP request sent, awaiting response... 200 OK
Length: unspecified
Saving to: ‘STDOUT’

  [<=>                                                               ] 0           --.-K/s              D
  [ <=>                                                              ] 4           --.-K/s   in 0s      

2015-01-12 15:28:20 (670 KB/s) - written to stdout [4]
#blank line here

在第一个“状态栏”行的末尾有一个“D”,它实际上是所需输出的第一个字符。我假设在刷新终端时输出在某个地方丢失了。较长的响应主体也会发生这种情况。

另一个观察结果是:如果我将输出重定向到文件,它会再次起作用:

 wget "http://localhost:9001" -O -  > /tmp/file
 cat /tmp/file
 Done

这种情况也会发生在非常宽的终端上。“状态栏”在变大,但响应主体仍然只有一个字符。

这是我这边的某个错误或配置错误吗?我在 gnome-terminal 和 xterm 上遇到了相同的行为(在 Ubuntu 14.04.1 LTS 上)。

答案1

一方面,使用-O -,您请求wget将接收到的数据写入stdout,它确实这样做了无缓冲。另一方面,除非你用 抑制它-q,否则wget会将进度信息写入stderr

如果不重定向其中一个流(使用> some_file),则它们都会显示同时地通过终端,它们不能很好地混合,特别是因为wget使用特殊字符来显示状态栏。

您期望的是wget

  1. 检索数据并将其存储在某处,同时显示进度状态
  2. 然后,检索完所有内容后,显示数据。

您可以使用临时文件执行此操作:

wget "http://localhost:9001" -O /tmp/some_file && cat /tmp/some_file

你也可以使用缓冲

wget "http://localhost:9001" -O - | buffer -b 1 -s 100000

相关内容