159

プロセスの標準出力を別のプロセスの標準入力にパイプする方法はよく知られています。

proc1 | proc2

しかし、proc1 の標準エラーを proc2 に送信し、標準出力を現在の場所に残しておきたい場合はどうすればよいでしょうか。bash次のようなコマンドがあると思います。

proc1 2| proc2

しかし、残念ながら、いいえ。これを行う方法はありますか?

4

5 に答える 5

192

工程代行もあります。これにより、プロセスがファイルの代わりになります。次のようにファイルに
送信できます。stderr

process1 2> file

ただし、次のようにファイルのプロセスを置き換えることができます。

process1 2> >(process2)

stderr画面に送信してログファイルに追加する具体的な例を次に示します。

sh myscript 2> >(tee -a errlog)
于 2012-03-27T11:28:26.943 に答える
101

次のトリックを使用して、とを交換 できます。次に、通常のパイプ機能を使用します。stdoutstderr

( proc1 3>&1 1>&2- 2>&3- ) | proc2

両方が最初stdoutstderr同じ場所を指していれば、必要なものが得られます。

x>&yビットが行うことは、ファイル ハンドルを変更して、ファイル ハンドルが現在ポイントしているx場所にデータを送信することです。y私たちの特定のケースでは:

  • 3>&1以下の最後の箇条書きのためにどこかに保存するためだけに、現在のハンドル(元の stdout) に出力する新しいハンドルを作成します。31
  • 1>&2ハンドル1(stdout) を変更して、現在のハンドル2(元の stderr) に出力します。
  • 2>&3-ハンドル2(stderr) を変更して現在のハンドル3(元の stdout) に出力し、ハンドルを閉じます3(最後の を介して-)。

これは事実上、ソート アルゴリズムで見られる swap コマンドです。

temp   = value1;
value1 = value2;
value2 = temp;
于 2009-10-02T05:15:50.840 に答える
79

Bash4には次の機能があります。

`|&'が使用されている場合、command1の標準エラーは、パイプを介してcommand2の標準入力に接続されます。2>&1|の省略形です。この標準エラーの暗黙的なリダイレクトは、コマンドで指定されたリダイレクトの後に実行されます。

zshにもこの機能があります。

-

他の/古いシェルでは、これを次のように明示的に入力してください

FirstCommand 2>&1 | OtherCommand

于 2009-10-02T06:14:28.380 に答える
32

交換は問題を解決するので素晴らしいです。元の stdout さえ必要ない場合に備えて、次の方法で行うことができます。

proc1 2>&1 1>/dev/null | proc2

順序は重要です。あなたはしたくないでしょう:

proc1 >/dev/null 2>&1 | proc1

これにより、すべてが/dev/null!にリダイレクトされます。

于 2011-12-16T14:24:50.763 に答える