Bash

如何將標準輸出和標準錯誤複製到日誌中?

  • August 21, 2017

我需要從腳本中將標準錯誤和標準輸出寫入$LOG,同時將它們列印在控制台上。

該腳本有許多命令,因此重定向每個命令並不是一個好的解決方案。

我已經嘗試過了,但它沒有按預期工作:

#!/bin/bash

LOG=/var/tmp/log

#...

exec > $LOG  2>&1

我的目標是寫入$LOG任何標準輸出和標準錯誤,但同時也寫入標準輸出(在控制台上)。是否可以?

使用tee。例如:

command 2>&1 | tee file.txt

它執行command將 SDTERR 重定向到 SDTOUT。tee將 STDIN 複製到 STDOUT 和 file file.txt

在 bash 中,您可以通過以下方式使用程序替換將輸出複製到$LOG

exec &> >(tee $LOG)

然而,這種bashism 不適用於其他 shell。

我不確定這是否是最乾淨的解決方案,但它對我有用:

#!/bin/bash

LOG=/var/tmp/log

(
# lots of commands
# ...

) 2>&1 | tee $LOG

不過,@sebasth 給出了更好的解決方案:

#!/bin/bash

LOG=/var/tmp/log

exec &> >(tee $LOG)

#...

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