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

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

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

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

ベストアンサー1

使用プロセスの交換そして&リダイレクトそしてexec:

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

$log_fileスクリプトの出力とすべての子プロセスが含まれ、出力も画面に印刷されます。

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

  • exec &> ...標準出力と標準エラーを...スクリプトの残りの部分にリダイレクトします(exec > ...標準出力のみ)。

  • tee -a標準入力をファイルに追加して画面に印刷します。

おすすめ記事