Bash
什麼會阻止命令的輸出?
有時我會嘗試 (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”的行,顯然不會導致輸出。