シェルスクリプトのようにstdoutをファイルに、stderrをファイルに、stdout + stderrをファイルに、stdout + stderrを端末に保存する方法

シェルスクリプトのようにstdoutをファイルに、stderrをファイルに、stdout + stderrをファイルに、stdout + stderrを端末に保存する方法

シェルスクリプトのようにstdoutをあるファイルに、stderrを別のファイルに、stdout + stderrを3番目のファイルに、stdout + stderrを端末に保存するにはどうすればよいですか?

私はこれを他の場所で見つけました。

exec > >(tee std_out) 2> >(tee err_out >&2)
ls # Should got to std_out
fsdfs # Command not found goes to err_out

本当に近いです。実行するとbash test.sh 2>&1 | tee output機能しますが、スクリプトの実行方法にアクセスできません。これはCIDシステムです。 execを使用してスクリプト内で「結合出力」を実行できる必要があります。

CI / CDライブラリを作成していますが、顧客がライブラリをどのように使用するのかわからないので、すべてのユースケースを検討したいと思います。

ベストアンサー1

簡単に方法を拡張してください。

exec 2> >(tee -a stderr stdall) 1> >(tee -a stdout stdall)

stderrはstdoutというファイルに書き込まれstderr、stderrstdoutとstdoutはコンソール(またはexec実行時に2つのファイル記述子が指すすべてのエントリ)とstdoutにも書き込まれますstdall。 (追加)は、書き込みを開始する2番目のデータが上書きされるのを
tee -a防ぐために必要です。stdalltee

気づく注文するリダイレクトを実行することが関連しています。 2番目のプロセスの交換は、最初のリダイレクトの影響を受けます。つまり、発生したエラーはに送信されます>(tee -a stderr stdall)。もちろん、/dev/nullこれらの副作用を避けるために、2番目のプロセス交換の標準エラーをリダイレクトできます。標準エラーの前に標準出力をリダイレクトすると、すべてのエラーがstdoutおよびに送信されますstdall

Bash プロセス置換コマンドが実行されるため非同期的、生成された順序で出力が表示されるという保証はありません。さらに悪いことは、標準出力と標準エラーの断片が同じ行に現れることです。

おすすめ記事