web-dev-qa-db-ja.com

シェル:標準出力を/ dev / nullに、標準エラー出力を標準出力にリダイレクト

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

私は、shを使用した1行のコマンドでこれを行うための柔軟な方法を見つけることすらできないことに気付きました。

ソリューションに関する私の考えは次のとおりです。

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

しかし、あなたは、これは同期的ではなく、致命的には非常にいことを知っています。

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

46
Shou Ya

あなたが欲しい

./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よりも明示的であることに注意してください

99
geirha

これはどう:

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

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

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

5
Zaar Hai