cyberciti.biz のコメントでこの興味深い質問を見ました。
私は、shを使用した1行のコマンドでこれを行うための柔軟な方法を見つけることすらできないことに気付きました。
ソリューションに関する私の考えは次のとおりです。
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が現在行っている場所(パイプ)にfd 2を移動させます。
0: /dev/tty, 1: pipe, 2: pipe
最後に、1>/dev/null
はfd1を/dev/null
にリダイレクトします
0: /dev/tty, 1: /dev/null, 2: pipe
最終結果、スクリプトの標準出力は無音になり、その標準エラー出力はパイプを介して送信され、最終的に他のスクリプトの標準入力になります。
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
アイデアは、標準出力記述子を「バックアップ」し、元の標準出力を閉じてから、保存された標準出力にstrerrをリダイレクトすることです。
Geirhaが提供するソリューションに非常に似ていますが、より明示的です(bashコーディングは非常にわかりにくくなる可能性があります)。