出於測試目的,我想保存stdout和單獨標準錯誤通過後續的代碼檢查。例如,錯誤輸入的測試運行應該導致輸出到標準錯誤,但沒有任何標準輸出,而測試運行正確的輸入應導致輸出到標準輸出,但沒有標準錯誤。節省必須是同步的,以避免與測試競爭條件(所以我不能使用process substitution)。保存標準輸出,標準錯誤和標準輸出+標準錯誤同步
爲了能夠在事後調試測試,我也需要看到stdout和stderr在它們輸出的順序。因此,我必須將它們保存到相同的文件/變量/任何內容,或者將它們同時保存到終端。
要測試發生了哪個錯誤,我還需要命令的退出代碼。
由於效率和準確性的原因,我當然不能每次運行兩次測試。
它是例如可能重定向標準輸出到stdout.log,stderr到stderr.log,和他們都在同一個命令output.log?或者對stdout和stderr分別使用同步tee
命令?或者保存stdout和stderr的副本來分離變量?
更新:它看起來像Tim的解決方案几乎作品(修改爲輸出端上,而不是記錄到all.log):
$ set -o pipefail
$ {
{
echo foo | tee stdout.log 2>&3 3>&-
} 2>&1 >&4 4>&- | tee stderr.log 2>&3 3>&-
} 3>&2 4>&1
foo
$ cat stdout.log
foo
$ cat stderr.log
$ {
{
echo foo >&2 | tee stdout.log 2>&3 3>&-
} 2>&1 >&4 4>&- | tee stderr.log 2>&3 3>&-
} 3>&2 4>&1
foo
$ cat stdout.log
$ cat stderr.log
foo
$ bar=$({
{
echo foo | tee stdout.log 2>&3 3>&-
} 2>&1 >&4 4>&- | tee stderr.log 2>&3 3>&-
} 3>&2 4>&1)
$ echo "$bar"
foo
$ cat stdout.log
foo
$ cat stderr.log
$ bar=$({
{
echo foo >&2 | tee stdout.log 2>&3 3>&-
} 2>&1 >&4 4>&- | tee stderr.log 2>&3 3>&-
} 3>&2 4>&1)
$ cat stdout.log
$ cat stderr.log
foo
$ echo "$bar"
foo
這似乎除了最後一次迭代,其中值工作的bar
被設置爲stderr的內容。任何建議所有這些工作?
假設我們正在談論基於行的字符串,我們可以管兩個流通過,說,'sed'在行首添加標記?然後,我們可以從日誌文件中知道哪一行來自哪個流。 – Raphael 2017-05-10 09:04:45
@Raphael:你應該能夠在每個進程替換內部的'tee'之前,例如:'exec>>(sed's/^/from STDOUT:/'| tee -a mylog)2>>(sed's/^ /來自STDERR:/'| tee -a mylog>&2)'(未經測試)。順便說一下,這將導致輸出到終端的也有這些前綴。 – 2017-05-10 14:24:28
酷!這不會使您給出的部分報價無效嗎?現在我們有一個sychronized共享輸出文件,並且仍然知道哪個是哪個,或者我錯過了什麼? – Raphael 2017-05-10 18:20:28