Bashスクリプトで、すべての標準出力をログファイルにリダイレクトし、tee
exec
を使用して画面上の出力をリダイレクトする方法を教えてください。
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
このコードは、すべてのログをログファイルにリダイレクトしますが、画面にはリダイレクトしません。
プロセス置換 を _&
_リダイレクト および 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
_は、その標準入力をファイルに追加し、画面に出力します。
exec >> $log_file 2>&1 && tail $log_file