什么可以阻止命令的输出?

什么可以阻止命令的输出?

有时我会尝试 (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 或终端的外观性错误。

相关内容