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


15

これは私のbashスクリプトファイルの一番上にあります。

export LOGFILE=$LOGDIRECTORY/${SCRIPT_NAME}.log
exec > >(tee $LOGFILE)
exec 2>&1

それは何をするためのものか?ここで実行している2つのexecプロセスは何ですか?このように保つと、スクリプトの実行のすべての出力がパイプされ$LOGFILEますが、execステートメントの観点から理解したかったのです。


これにより、明確になる可能性があります:linuxjournal.com/content/bash-redirections-using-exec
coffeMug

1
これは bashスクリプトファイルの先頭に表示されましたか?;)
Sebb

1
2 exec行は完全に1つ(exec > >(tee "$LOGFILE") 2>&1)になります。
ジョナサンレフラー

回答:


18

シェルでexecは、1)ファイルのオープンとリダイレクト2)実際のexecing(現在のプロセスイメージを別のプロセスイメージに置き換える)を行います。

これらexecはリダイレクトです。

最初にexec 1> >(tee $LOGFILE)stdout記述子(1)を、最初の引数として同時に実行さteeれるプロセスに接続されたプロセス置換生成パイプに$LOGFILEリダイレクトstderr()してから、記述子(2)が記述子が1指す場所と同じ場所(ティー)にリダイレクトしますパイプ)。

ファイル記述子が継承されることを念頭に置いて、あなたはすべての将来stdoutを作成し、stderr出力はteeプロセスに$LOGFILE送られ、ファイル記述子1が元々(おそらくあなたの端末)を指していた場所に書き込みます。


注: teeプロセスは、元のstdout(=元のファイル記述子1)に出力します。これは、/ searching bash(1)から学習できるように、単純なコマンド拡張プロセス置換のために、プロセス置換(>() <())が(他の拡張とともに)発生する前にリダイレクトが実行されます、でリダイレクトがいることをどの手段exec 1> >(tee "$LOGFILE")が起こる後は tee残して、開始されたteeことは、親シェルから継承されたのと同じファイル記述子1で。(逆の場合tee、独自の入力に書き込むようになり、IOパターンに応じてデッドロックになる可能性があります)。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.