STDERRで印刷する前にファイルを変更して書き込む方法

STDERRで印刷する前にファイルを変更して書き込む方法

stderrGitHub Actionsを介して自動プール要求チェックを実行しており、ジョブ間でコマンド出力の一部のデータを保持したいと思います。

stderrそのために人工生産ただし、その前にいくつかの制御文字も削除する必要がありますsed。それ以外の場合は、次のような結果が発生します。

\x1b[31mFound 344 errors!\x1b[39;49m

その後、メインコマンドは同じ終了コードを返し、チェックに失敗し、プール要求がマージされるのを防ぎます。

おそらく実行する必要があるタスクのサブセットを処理できますが、3つのタスクすべてを一緒に処理することはできません(sed> file write> stderr)。より簡単な場合は、stdoutファイルに書き込むこともできますstderr

これを別の方法で行うための提案を開きます。

答え1

シェルリダイレクト演算子の組み合わせを使用してこの問題を解決できました。teeユーティリティ量pipefailシェルオプション:

set -o pipefail; somecommand 2&>1 | tee ./artifact.txt; set +o pipefail

基本的には次のようになります。

  1. パイプの戻り状態をゼロ以外の状態で終了した最後のコマンドの値に設定するか、すべてのコマンドが正常に終了した場合は0に設定します。
  2. stderrからコピーstdout2&>1(または略語)に|&渡された後stdintee
  3. teeコピーすると呼び出されますstdinstdoutartifact.txt
  4. 元のパイプライン設定を復元します。

明らかに、Bashには2番目のコマンドでパイプを許可する短い構文がないので、両方を使用してファイルにコピーするstdout必要がありました。stderrstderr


その他の参考資料:

答え2

その後、bash次を実行できます。

$ somecommand 2>&1 | tee ./artifact.txt;echo "${PIPESTATUS[@]}"

そして、パイプライン全体の終了コードを取得します。

関連情報