私のBashスクリプトファイルの上部に次のように表示されます。
export LOGFILE=$LOGDIRECTORY/${SCRIPT_NAME}.log
exec > >(tee $LOGFILE)
exec 2>&1
それは何をしますか?ここで2つのexecプロセスは何をしていますか?これを維持すると、スクリプト実行のすべての出力がパイプで接続されることがわかりますが、ステートメントの観点から理解したいと$LOGFILE
思います。exec
答え1
シェルではexec
、1)ファイルを開いてリダイレクトする2)実際のexec
作業(現在のプロセスイメージを別のプロセスイメージに置き換えます)を実行します。
リダイレクトexec
です。
まず、ディスクリプタ1をexec 1> >(tee $LOGFILE)
同時に実行中のプロセス(プロセスに最初のパラメータがある)stdout
に接続されたプロセス置換によって生成されたパイプにリダイレクトし、次にディスクリプタ2をディスクリプタにリダイレクトして同じ場所(ティーパイプ)。tee
$LOGFILE
stderr
1
stdout
ファイル記述子が継承されることを覚えておいてください。すべての future とstderr
出力を process に送信し、プロセスはファイル記述子 1 が元のポイント (おそらく端末) にtee
それを記録します。$LOGFILE
メモ:
/searchingが示すように、teeプロセスは生のstdout(= rawファイル記述子1)として出力されます。大きな打撃(1)~のため簡単なコマンド拡張そしてプロセスの交換>()
<()
、リダイレクト(およびその他の拡張)が実行される前にプロセス置換()が発生します。これはリダイレクトがexec 1> >(tee "$LOGFILE")
発生することを意味します。後ろに tee
tee
親シェルから継承したのと同じファイル記述子1で始まりました。 (反対の場合は、tee
独自の入力を作成するため、IOモードによってデッドロックが発生する可能性があります。)