Bash
在控制台上輸出 stderr 和 stdout 並同時將它們儲存在一個文件中
我可以在控制台螢幕上同時輸出
stdout
和輸出並將其中一個儲存到日誌文件中嗎?stderr
我寫了一個測試shell腳本:
#!/bin/sh echo OUT! >&1 echo ERR! >&2
我可以通過執行腳本在螢幕上輸出它們:
$./test OUT! ERR!
我可以通過以下方式輸出
stderr
並擷取stdout
到日誌文件中:$./test | tee 1>log ERR! $cat log OUT!
我只能通過以下方式擷取所有內容
stdout
並將其輸出stderro
到日誌文件中:$./test 2>&1| tee 1>log $cat log OUT! ERR!
我可以通過以下方式輸出
stdout
和stderr
並將它們全部擷取到日誌文件中:$./test 2>&1 | tee log OUT! ERR! $cat log OUT! ERR!
我可以通過以下方式輸出兩者都可以擷取
stdout
到日誌文件中:$./test | tee 2>&1 log ERR! OUT! $cat log OUT!
我的問題是:
- 如何輸出
stdout
並擷取stderr
到文件中?(我試過了./test|tee 2>log
,但不起作用)- 如何同時輸出並擷取
stderr
到文件中?
- 如何只輸出標準輸出並將標準錯誤擷取到文件中?(我試過 ./test|tee 2>log,但不起作用)
$ ./test 2>log OUT! $ cat log ERR!
- 如何只輸出兩者並將stderr擷取到文件中?
$ ./test 2>&1 >/dev/tty | tee log OUT! ERR! $ cat log ERR!
如果此表達式要成為更大管道的一部分,那麼您可能希望避免使用
/dev/tty
. 一種方法是交換標準輸出和標準錯誤。要進行此交換,我們需要創建第三個文件句柄,如下所示:$ exec 3>&1; ./test 2>&1 1>&3 | tee log; exec 3>&- OUT! ERR! $ cat log ERR!
第一條語句,
exec 3>&1
將文件句柄 3 分配給目前的標準輸出(無論它可能是什麼)。然後,在將 stdout 發送到文件句柄 3 的同時,將./test 2>&1 1>&3 | tee log
stderr 傳遞給tee
命令。最後,為了進行良好的內務管理,exec 3>&-
關閉文件句柄 3。附加說明和評論
關於:
我可以通過以下方式輸出標準錯誤並將標準輸出擷取到日誌文件中:
$./test | tee 1>log ERR! $cat log OUT!
這可以簡化為:
$ ./test >log ERR! $ cat log OUT!
另外,關於:
我只能通過以下方式將所有 stdout 和 stderro 擷取到日誌文件中:
$ ./test 2>&1| tee 1>log $ cat log OUT! ERR!
這可以簡化為:
$ ./test >log 2>&1 $ cat log OUT! ERR!
或者,使用
bash
,但不是 POSIX shell,可以使用更簡單的形式:$ ./test &>log $ cat log OUT! ERR!