Bash
程序如何輸出到 STDOUT/STDERR 以外的其他地方?如何避免?
顯然我不知道所有可用的輸出目的地。我知道
stdout
(&1
) 和stderr
(&2
)。但是,在重定向兩個描述符之後,有時我的控制台中仍然會得到一些輸出!我能想到的最簡單的例子是 GNU Parallel。每次我使用它時,我都會看到一個引用通知。即使我這樣做
&2>1 > file
了,我仍然看到通知。這同樣適用於
emerge
:當我執行emerge並且出現一些問題時,一些資訊不會列印到stdout
norstdin
,因為我重定向它們並且它們仍然通過。我主要通過使用來解決這些問題
script
,但我仍然想知道是什麼導致了這個問題。
您使用的語法是錯誤的。
cmd &2>1 >file
將被拆分為
cmd & 2>1 >file
這會:
cmd
作為沒有重定向的後台作業執行- 在一個單獨的程序中(沒有命令!)將重定向
stderr
到一個字面上呼叫的文件1
並重定向stdout
到file
你想要的語法是:
cmd >file 2>&1
操作順序很重要。這會:
- 重定向
stdout
到file
- 重定向
stderr
到&1
- 即與相同的文件句柄stdout
結果是兩者都
stderr
將stdout
被重定向到file
.在
bash
中,一個更簡單的非標準(因此我不推薦它,基於可移植性的理由)語法cmd &> file
做同樣的事情。