この興味深い質問は、 cyberciti.bizのコメントで見ました。
sh.
解決策に対する私の考えは次のとおりです。
tmp_file=`mktemp`
(./script 2>$tmp_file >/dev/null; cat $tmp_file) | ./other-script
rm tmp_file
しかし、ご覧のとおり、これは同期的ではなく、致命的なことに、とても醜いです。
これについてあなたの心を共有することを歓迎します。:)
この興味深い質問は、 cyberciti.bizのコメントで見ました。
sh.
解決策に対する私の考えは次のとおりです。
tmp_file=`mktemp`
(./script 2>$tmp_file >/dev/null; cat $tmp_file) | ./other-script
rm tmp_file
しかし、ご覧のとおり、これは同期的ではなく、致命的なことに、とても醜いです。
これについてあなたの心を共有することを歓迎します。:)
あなたが欲しい
./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>&1
fd 1が現在移動している場所、つまりパイプにfd2を移動させます。
0: /dev/tty, 1: pipe, 2: pipe
最後に、1>/dev/null
fd1をにリダイレクトします/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
これはどう:
./script 3>&1 1>/dev/null 2>&3 | ./other-script
アイデアは、stdout記述子を「バックアップ」し、元のstdoutを閉じてから、保存されたstdoutにstrerrをリダイレクトすることです。
geirhaが提供するソリューションと非常に似ていますが、より明確です(bashコーディングは簡単に非常にわかりにくくなる可能性があります)。
まあ、それはあなたができないからです。STDOUTとSTDERRは、ファイル記述子で表される2つのファイルであり、整数、具体的には1と2です。
求めているのは、記述子2をに/dev/null
設定してから、記述子3を同じファイル記述子2に設定し、その出力を別の場所に移動させることです。