Bash

什麼會阻止命令的輸出?

  • October 6, 2015

有時我會嘗試 (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]

標準輸出不應該把它寫到螢幕上嗎?

但是:

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
--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 或終端錯誤。

這裡wget -O- http://localhost/test.txt 2>&1確實將下載的內容寫入標準輸出。

grep 'foo' | grep 'bar'如果沒有包含“foo”和“bar”的行,顯然不會導致輸出

引用自:https://serverfault.com/questions/488731