合併 stdout 和 stderr,並分別建立每個的副本

合併 stdout 和 stderr,並分別建立每個的副本

我的目標最好透過例子來解釋。首先,這是一個將在 stdout 和 stderr 上產生範例輸出的函數:

output() {
  printf '%s\n' 1 2
  printf '%s\n' errA errB 1>&2
  printf '%s\n' 3 4
}

如果您單獨運行它,兩個流都將按執行順序列印到終端:

$ output
1
2
errA
errB
3
4

現在這個函數只是一個佔位符,代表我們希望記錄的任意腳本的輸出(stdout 和 stderr)。具體來說,我們要建立三個不同的日誌:

  1. stdout 和 stderr 的組合執行順序輸出(即上面的輸出)。
  2. 只是標準輸出
  3. 只是 stderr 輸出

我想出的最接近的解決方案是:

$ { output > >(tee out) 2> >(tee err >&2); } > both 2>&1
$ ls
both  err  out
$ cat both
errA
errB
1
2
3
4
$ cat out
1
2
3
4
$ cat err
errA
errB

正如您所看到的,outerr文件是所需的,但組合後的文件both不保持執行順序。

有沒有辦法同時建立 3 個所需的日誌檔案?

output作為一個額外的問題,當函數單獨運行時,執行順序輸出是否真的得到保證?我嘗試運行多次,終端中的混合 stdout 和 stderr 始終相同,並且順序正確。但這與保證不同。

相關內容