ログファイルのexecとtee:これらのbashコマンドの説明

ログファイルのexecとtee:これらのbashコマンドの説明

私の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$LOGFILEstderr1

stdoutファイル記述子が継承されることを覚えておいてください。すべての future とstderr出力を process に送信し、プロセスはファイル記述子 1 が元のポイント (おそらく端末) にteeそれを記録します。$LOGFILE


メモ: /searchingが示すように、teeプロセスは生のstdout(= rawファイル記述子1)として出力されます。大きな打撃(1)~のため簡単なコマンド拡張そしてプロセスの交換>() <()、リダイレクト(およびその他の拡張)が実行される前にプロセス置換()が発生します。これはリダイレクトがexec 1> >(tee "$LOGFILE")発生することを意味します。後ろに teetee親シェルから継承したのと同じファイル記述子1で始まりました。 (反対の場合は、tee独自の入力を作成するため、IOモードによってデッドロックが発生する可能性があります。)

おすすめ記事