コードがあり、非常に詳細なモードで実行されているとします。この最大の詳細度では、すべての状況を確認するために読みたいメッセージが表示されます。ただし、ターミナルには他のコンテンツがあふれています。
stderror パイプラインを stdout パイプラインに移行せずに、stderror 出力を grep フィルタリングする方法はありますか?
例えば、
my-command 2>&1 | grep something # ok, great; is it possible without the pipe shift?
これは可能ですか?
i.e., maybe
my-command 2>(grep something)?
答え1
これら 2 つのオプションを回答として記載していますが、実際には質問に対する回答にはなりません (答えは「bash では、いいえ」です)。これは、他の誰かがこれを見た場合に備えて、また、stdout と stderr を交換する方法を示し、フォーマットを正しくするためです (コメントとは異なります)。
答え1: これは実行したいプログラムだと仮定します(コマンドのようには見えませんが、コマンドであると仮定します。全てこれを実際に実行したいコマンドと引数に置き換えます):
{ echo stdout; echo stderr >&2; }
ここで、stderr のみを grep して何かを検索し、stdout はそのままにしたいとします。
{ echo stdout; echo stderr >&2; } 2> >(grep something)
もしそれが全てそうすると、stdout のすべてと、stderr の何かが含まれている部分が混在して取得されます。後で表示できるように、stdout と stderr を別々のファイルに書き込むこともできます。
{ echo stdout; echo stderr >&2; } 2> >(grep something > errorfile) > outputfile
stdoutとstderrの入れ替えについては(そしてなぜそうするのかについては)https://stackoverflow.com/questions/13299317/io-redirection-swapping-stdout-and-stderr私が説明できるよりも良い説明をお願いします。