Bash

程序如何輸出到 STDOUT/STDERR 以外的其他地方?如何避免?

  • January 10, 2018

顯然我不知道所有可用的輸出目的地。我知道stdout( &1) 和stderr( &2)。但是,在重定向兩個描述符之後,有時我的控制台中仍然會得到一些輸出!

我能想到的最簡單的例子是 GNU Parallel。每次我使用它時,我都會看到一個引用通知。即使我這樣做&2>1 > file了,我仍然看到通知。

這同樣適用於emerge:當我執行emerge並且出現一些問題時,一些資訊不會列印到stdoutnor stdin,因為我重定向它們並且它們仍然通過。

我主要通過使用來解決這些問題script,但我仍然想知道是什麼導致了這個問題。

您使用的語法是錯誤的。

cmd &2>1 >file

將被拆分為

cmd &
2>1 >file

這會:

  1. cmd作為沒有重定向的後台作業執行
  2. 在一個單獨的程序中(沒有命令!)將重定向stderr到一個字面上呼叫的文件1並重定向stdoutfile

你想要的語法是:

cmd >file 2>&1

操作順序很重要。這會:

  1. 重定向stdoutfile
  2. 重定向stderr&1- 即與相同的文件句柄stdout

結果是兩者都stderrstdout被重定向到file.

bash中,一個更簡單的非標準(因此我不推薦它,基於可移植性的理由)語法cmd &> file做同樣的事情。

引用自:https://unix.stackexchange.com/questions/296100