我的目標最好透過例子來解釋。首先,這是一個將在 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)。具體來說,我們要建立三個不同的日誌:
- stdout 和 stderr 的組合執行順序輸出(即上面的輸出)。
- 只是標準輸出
- 只是 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
正如您所看到的,out
和err
文件是所需的,但組合後的文件both
不保持執行順序。
有沒有辦法同時建立 3 個所需的日誌檔案?
output
作為一個額外的問題,當函數單獨運行時,執行順序輸出是否真的得到保證?我嘗試運行多次,終端中的混合 stdout 和 stderr 始終相同,並且順序正確。但這與保證不同。