有时我会尝试 (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 时,只有重定向到文件或命令时才会起作用?
答案1
这里wget -O- http://localhost/test.txt 2>&1
确实将下载的内容写入标准输出。
grep 'foo' | grep 'bar'
如果没有包含以下内容的行,则显然不会产生输出两个都“foo” 和 “bar”。
答案2
自从升级了几次之后,我发现现在的行为已经符合预期。
$ wget -O- http://localhost/test.txt 2>&1
--2015-10-06 14:39:58-- http://localhost/test.txt
Resolving localhost (localhost)... 127.0.0.1
Connecting to localhost (localhost)|127.0.0.1|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 10 [text/plain]
Saving to: 'STDOUT’
- 0%[ ] 0 --.-KB/s It works!
- 100%[============================================>] 10 --.-KB/s in 0s
2015-10-06 14:39:58 (918 KB/s) - written to stdout [10/10]
如您所见,在第一行进度的末尾“It works!”(文本文件的内容)与输出正确合并。
面对任何其他合理的解释,我只能得出结论:这一定是 bash 或终端的外观性错误。