web-dev-qa-db-ja.com

execとteeを使用してログをstdoutとログファイルに同時にリダイレクトする

Bashスクリプトで、すべての標準出力をログファイルにリダイレクトし、teeexecを使用して画面上の出力をリダイレクトする方法を教えてください。

log_file="$HOME/logs/install.txt-`date +'%Y-%m-%d_%H-%M-%S'`"
[ -f "$log_file" ] || touch "$log_file"
exec 1>> $log_file 2>&1

このコードは、すべてのログをログファイルにリダイレクトしますが、画面にはリダイレクトしません。

29
4m1nh4j1

プロセス置換_&_リダイレクト および exec とともに使用します。

_exec &> >(tee -a "$log_file")
echo "This will be logged to the file and to the screen"
_

_$log_file_には、スクリプトとすべてのサブプロセスの出力が含まれ、出力も画面に出力されます。

  • >(...)は、プロセス_..._を開始し、その標準入力を表すファイルを返します。

  • _exec &> ..._は、スクリプトの残りの部分では、標準出力と標準エラーの両方を_..._にリダイレクトします(stdoutの場合のみ_exec > ..._を使用します)。

  • _tee -a_は、その標準入力をファイルに追加し、画面に出力します。

57
Michael Homer
exec >> $log_file 2>&1 && tail $log_file
8
Farhadix