プロセスの標準出力を別のプロセスの標準入力にパイプする方法はよく知られています。
proc1 | proc2
しかし、proc1 の標準エラーを proc2 に送信し、標準出力を現在の場所に残しておきたい場合はどうすればよいでしょうか。bash
次のようなコマンドがあると思います。
proc1 2| proc2
しかし、残念ながら、いいえ。これを行う方法はありますか?
工程代行もあります。これにより、プロセスがファイルの代わりになります。次のようにファイルに
送信できます。stderr
process1 2> file
ただし、次のようにファイルのプロセスを置き換えることができます。
process1 2> >(process2)
stderr
画面に送信してログファイルに追加する具体的な例を次に示します。
sh myscript 2> >(tee -a errlog)
次のトリックを使用して、とを交換 できます。次に、通常のパイプ機能を使用します。stdout
stderr
( proc1 3>&1 1>&2- 2>&3- ) | proc2
両方が最初stdout
にstderr
同じ場所を指していれば、必要なものが得られます。
x>&y
ビットが行うことは、ファイル ハンドルを変更して、ファイル ハンドルが現在ポイントしているx
場所にデータを送信することです。y
私たちの特定のケースでは:
3>&1
以下の最後の箇条書きのためにどこかに保存するためだけに、現在のハンドル(元の stdout) に出力する新しいハンドルを作成します。3
1
1>&2
ハンドル1
(stdout) を変更して、現在のハンドル2
(元の stderr) に出力します。2>&3-
ハンドル2
(stderr) を変更して現在のハンドル3
(元の stdout) に出力し、ハンドルを閉じます3
(最後の を介して-
)。これは事実上、ソート アルゴリズムで見られる swap コマンドです。
temp = value1;
value1 = value2;
value2 = temp;
Bash4には次の機能があります。
`|&'が使用されている場合、command1の標準エラーは、パイプを介してcommand2の標準入力に接続されます。2>&1|の省略形です。この標準エラーの暗黙的なリダイレクトは、コマンドで指定されたリダイレクトの後に実行されます。
zshにもこの機能があります。
-
他の/古いシェルでは、これを次のように明示的に入力してください
FirstCommand 2>&1 | OtherCommand
交換は問題を解決するので素晴らしいです。元の stdout さえ必要ない場合に備えて、次の方法で行うことができます。
proc1 2>&1 1>/dev/null | proc2
順序は重要です。あなたはしたくないでしょう:
proc1 >/dev/null 2>&1 | proc1
これにより、すべてが/dev/null
!にリダイレクトされます。