Bash

在控制台上輸出 stderr 和 stdout 並同時將它們儲存在一個文件中

  • March 17, 2021

我可以在控制台螢幕上同時輸出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!

我可以通過以下方式輸出stdoutstderr並將它們全部擷取到日誌文件中:

$./test 2>&1 | tee log
OUT!
ERR!

$cat log 
OUT!
ERR!

我可以通過以下方式輸出兩者都可以擷取stdout到日誌文件中:

$./test | tee 2>&1 log
ERR!
OUT!

$cat log 
OUT!

我的問題是:

  1. 如何輸出stdout並擷取stderr到文件中?(我試過了./test|tee 2>log,但不起作用)
  2. 如何同時輸出並擷取stderr到文件中?
  1. 如何只輸出標準輸出並將標準錯誤擷取到文件中?(我試過 ./test|tee 2>log,但不起作用)
$ ./test 2>log
OUT!
$ cat log
ERR!
  1. 如何只輸出兩者並將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 logstderr 傳遞給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!

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