シェルからstderrにリダイレクトする

シェルからstderrにリダイレクトする

bashシェルタグを使ってSOから誤って要求して、これがより適切な場所だと思ったので、もう一度質問しました。

AWS DataPipelineはリレーショナルデータベースに接続するシェルスクリプトを作成していますが、SQLエラーでも終了コードは0なので、stderrをキャプチャしてリダイレクトする必要があります。

内容を確認するためにstderrを別のファイルにリダイレクトしましたが、まだstderrがいっぱいになりたいです。その理由は、DataPipeline がすべての stderr と stdout をキャプチャし、両方とも 1 つのログに入れるからです。リダイレクトのために失敗したSQLコマンドからstderrをキャプチャしません。それでもstderrを埋める方法はありますか?私が現在持っているものは次のとおりです。

/bin/snowsql -f /home/scripts/dev/dev.sql 2> /home/scripts/dev/stderr.txt

Bashには以下が適用されます。

/bin/snowsql -f /home/scripts/dev/dev.sql 2> >(tee /home/scripts/dev/stderr.txt >&2)

シェルプロセス置換の正しい構文が見つかりません。シェルで上記のタスクを実行するのと同じことは何ですか?

ベストアンサー1

では、shstdoutを他のコマンドにのみパイプすることができるので、まずstdoutとstderrを置き換える必要があります。

/bin/snowsql -f /home/scripts/dev/dev.sql 3>&2 2>&1 >&3 3>- | tee /home/scripts/dev/stderr.txt

リダイレクトは、最初に作成されたパイプを除いて左から右に実行されるため、実行される操作は次のとおりです。

  1. パイプを開き、その中にstdoutをリダイレクトします(|)。
  2. 後で再利用できるようにstderrをコピーし、ファイル記述子3(任意)をここにリダイレクトします(3>&2)。
  3. stdout(現在のパイプにリダイレクト)をコピーし、stderrをパイプにリダイレクトします(2>&1)。
  4. ファイル記述子3を複製し(現在のソースstderrにリダイレクトされます)、stdoutをそのファイルにリダイレクトします(>&3)。
  5. ファイル記述子3閉じる(3>-

この状態で我々はstdoutとstderrを交換し、パイプはstderrを受け取ります。次に、tee標準エラーをファイルに書き込んで、独自の標準出力に再出力する作業を実行します。

ヒントへのStackOverflowの回答に感謝します。https://stackoverflow.com/a/2381643

おすすめ記事