有时我会尝试 (2>&1) 重定向,并且部分/所有结果输出似乎被静音。
例如
wget -O- http://localhost/test.txt 2>&1
我希望看到 test.txt 的内容与传输输出的合并,但结果只是输出到 stderr 而不是输出到 stdout:
--2013-03-18 14:53:41-- http://localhost/test.txt
Resolving localhost... 127.0.0.1
Connecting to localhost|127.0.0.1|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 9 [text/plain]
Saving to: `STDOUT'
0% [ ] 0 --.-K/s 1100%
[======================================>] 9 --.-K/s in 0s
2013-03-18 14:53:41 (2.09 MB/s) - written to stdout [9/9]
stdout 不应该把它写到屏幕上吗?
但是:
wget -O- http://localhost/test.txt 2>&1 > test.stdout
导致文件按预期写入 test.stdout。
同样,我在期望脚本 (send_user) 和多个 grep 管道中看到了这种行为。例如
/myexpectscript | grep 'blah'
工作并过滤除包含“blah”的行之外的所有行,但是
/myexpectscript | grep 'foo' | grep 'bar'
导致空白输出。
当我想使用 tee 复制输出时,我是如何发现这一点的。例如
wget -O- http://localhost/test.txt 2>&1 | tee
结果根本没有输出,而:
wget -O- http://localhost/test.txt | tee
结果是:
--2013-03-18 15:16:42-- http://localhost/ddns/checkip.php
Resolving localhost... 127.0.0.1
Connecting to localhost|127.0.0.1|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 9 [text/plain]
Saving to: `STDOUT'
127.0.0.1100%[======================================>] 9 --.-K/s in 0s
2013-03-18 15:16:42 (2.30 MB/s) - written to stdout [9/9]
(注意第8行列出了test.txt“127.0.0.1”的内容)
什么情况下重定向输出会被阻塞?为什么 wget 到 stdout 的假定输出仅在重定向到文件或命令时有效?
这里
wget -O- http://localhost/test.txt 2>&1
确实将下载的内容写入标准输出。grep 'foo' | grep 'bar'
如果没有同时包含“foo”和“bar”的行,显然不会产生任何输出。由于升级了几次,我发现现在的行为符合预期。
如您所见,在第一行进度条的末尾“It works!” (文本文件的内容)与输出正确合并。
面对任何其他合理的解释,我只能得出结论,这一定是 bash 或装饰性的终端错误。