stderr
GitHub 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
基本的には次のようになります。
- パイプの戻り状態をゼロ以外の状態で終了した最後のコマンドの値に設定するか、すべてのコマンドが正常に終了した場合は0に設定します。
- 次
stderr
からコピーstdout
2&>1
(または略語)に|&
渡された後stdin
tee
tee
コピーすると呼び出されますstdin
。stdout
artifact.txt
- 元のパイプライン設定を復元します。
明らかに、Bashには2番目のコマンドでパイプを許可する短い構文がないので、両方を使用してファイルにコピーするstdout
必要がありました。stderr
stderr
その他の参考資料:
答え2
その後、bash
次を実行できます。
$ somecommand 2>&1 | tee ./artifact.txt;echo "${PIPESTATUS[@]}"
そして、パイプライン全体の終了コードを取得します。