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
では、sh
stdoutを他のコマンドにのみパイプすることができるので、まずstdoutとstderrを置き換える必要があります。
/bin/snowsql -f /home/scripts/dev/dev.sql 3>&2 2>&1 >&3 3>- | tee /home/scripts/dev/stderr.txt
リダイレクトは、最初に作成されたパイプを除いて左から右に実行されるため、実行される操作は次のとおりです。
- パイプを開き、その中にstdoutをリダイレクトします(
|
)。 - 後で再利用できるようにstderrをコピーし、ファイル記述子3(任意)をここにリダイレクトします(
3>&2
)。 - stdout(現在のパイプにリダイレクト)をコピーし、stderrをパイプにリダイレクトします(
2>&1
)。 - ファイル記述子3を複製し(現在のソースstderrにリダイレクトされます)、stdoutをそのファイルにリダイレクトします(
>&3
)。 - ファイル記述子3閉じる(
3>-
)
この状態で我々はstdoutとstderrを交換し、パイプはstderrを受け取ります。次に、tee
標準エラーをファイルに書き込んで、独自の標準出力に再出力する作業を実行します。
ヒントへのStackOverflowの回答に感謝します。https://stackoverflow.com/a/2381643