私は最近AWS仮想マシン設定スクリプトを台無しにしました。ドキュメントには次の行を含めるように指示されています。
exec > >(tee /var/log/user-data.log|logger -t user-data -s 2>/dev/console) 2>&1
yum -y update
echo "Hello from user-data!"
後でAWSウェブサイトから仮想マシンログにアクセスできます。
しかし、ここではAWSは重要ではありません。最初のコマンドの機能が正確に何であるか疑問に思います。>
orのような基本的なbashリダイレクトを知っていますが、入れ子になったリダイレクト(、、)2>&1
が多すぎるという事実はこの精神を失います。exec > >
-s 2>dev/console
ステップごとに説明すると、次のようになります。
2>&1
だから私たちは最後に来ました。これは意味しますcopy stdout to stderr
。これは後で重要になります。exec > >
。何?私は>file
はいエイリアスを知っています1>file
。だから基本的にそれはexec 1>1>(tee ...| logger ...)
?だからなぜダメexec>(tee ...|logger...)
?exec > >(tee /var/log-user-data.log|logger -t user-data -s 2>/dev/console)
角かっこは(tee ...|logger ...)
execからstdoutを受け取り、ファイルに入れます。問題は、teeがstdinから読み取ってファイルに出力する必要があることです。しかし、ここでは標準出力に渡します。基本的にそれはすべてですか1|tee file
?パイプはそのような記述子IDと一緒に使用できないことがわかります。Teeは標準出力を取得し、ロガーの標準入力として印刷します。次に、ロガー記述子 "2" (stdin と stderr を含む) を /dev/console に追加します。ところで、なぜパイプなのか?ロガーはすでに記述子番号2のstdoutにアクセスできます。