我有一个用 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
:
- 检索数据并将其存储在某处,同时显示进度状态
- 然后,检索完所有内容后,显示数据。
您可以使用临时文件执行此操作:
wget "http://localhost:9001" -O /tmp/some_file && cat /tmp/some_file
你也可以使用缓冲:
wget "http://localhost:9001" -O - | buffer -b 1 -s 100000