62

この興味深い質問は、 cyberciti.bizのコメントで見ました。

sh.

解決策に対する私の考えは次のとおりです。

tmp_file=`mktemp`
(./script 2>$tmp_file >/dev/null; cat $tmp_file) | ./other-script
rm tmp_file

しかし、ご覧のとおり、これは同期的ではなく、致命的なことに、とても醜いです。

これについてあなたの心を共有することを歓迎します。:)

4

3 に答える 3

123

あなたが欲しい

./script 2>&1 1>/dev/null | ./other-script

ここでの順序は重要です。stdin(fd 0)、stdout(fd 1)、およびstderr(fd 2)が最初はすべてttyに接続されていると仮定します。

0: /dev/tty, 1: /dev/tty, 2: /dev/tty

最初に設定されるのはパイプです。other-scriptのstdinがパイプに接続され、scriptのstdoutがパイプに接続されるため、これまでのスクリプトのファイル記述子は次のようになります。

0: /dev/tty, 1: pipe, 2: /dev/tty

次に、リダイレクトが左から右に発生します。2>&1fd 1が現在移動している場所、つまりパイプにfd2を移動させます。

0: /dev/tty, 1: pipe, 2: pipe

最後に、1>/dev/nullfd1をにリダイレクトします/dev/null

0: /dev/tty, 1: /dev/null, 2: pipe

最終的に、スクリプトのstdoutは無音になり、そのstderrはパイプを介して送信され、最終的にother-scriptのstdinになります。

http://bash-hackers.org/wiki/doku.php/howto/redirection_tutorialも参照してください。

1>/dev/nullまた、これは同義ですが、より明示的であることに注意してください>/dev/null

于 2012-08-19T14:22:12.140 に答える
6

これはどう:

./script 3>&1 1>/dev/null 2>&3 | ./other-script

アイデアは、stdout記述子を「バックアップ」し、元のstdoutを閉じてから、保存されたstdoutにstrerrをリダイレクトすることです。

geirhaが提供するソリューションと非常に似ていますが、より明確です(bashコーディングは簡単に非常にわかりにくくなる可能性があります)。

于 2012-08-19T14:25:27.143 に答える
-3

まあ、それはあなたができないからです。STDOUTとSTDERRは、ファイル記述子で表される2つのファイルであり、整数、具体的には1と2です。

求めているのは、記述子2をに/dev/null設定してから、記述子3を同じファイル記述子2に設定し、その出力を別の場所に移動させることです。

于 2012-08-19T14:22:32.220 に答える