Bash複合リダイレクト(このコマンドの機能は何ですか)?

Bash複合リダイレクト(このコマンドの機能は何ですか)?

私は最近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

ステップごとに説明すると、次のようになります。

  1. 2>&1だから私たちは最後に来ました。これは意味しますcopy stdout to stderr。これは後で重要になります。
  2. exec > >。何?私は>fileはいエイリアスを知っています1>file。だから基本的にそれはexec 1>1>(tee ...| logger ...)?だからなぜダメexec>(tee ...|logger...)

  3. 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と一緒に使用できないことがわかります。

  4. Teeは標準出力を取得し、ロガーの標準入力として印刷します。次に、ロガー記述子 "2" (stdin と stderr を含む) を /dev/console に追加します。ところで、なぜパイプなのか?ロガーはすでに記述子番号2のstdoutにアクセスできます。

ベストアンサー1

おすすめ記事