一部のLinuxプログラムの出力がSTDOUTにもSTDERRにも送信されないのはなぜですか?
実際、使用する「ストリーム」に関係なく、すべてのプログラム出力を確実にキャプチャする方法を知りたいです。私が抱えている問題は、一部のプログラムが出力をキャプチャできないように見えることです。
例は「time」コマンドです。
time sleep 1 2>&1 > /dev/null
real 0m1.003s
user 0m0.000s
sys 0m0.000s
または
time sleep 1 &> /dev/null
real 0m1.003s
user 0m0.000s
sys 0m0.000s
なぜ両方の時間に出力が表示されるのですか?私はそれがすべて / dev/null にパイプされることを期待していました。
どの出力ストリームが使用されていますか?それをファイルにパイプするにはどうすればよいですか?
この問題を回避する1つの方法は、_ Bash スクリプトを作成することです。たとえば、combine.sh
このコマンドを含む:
$@ 2>&1
次に、「時間」の出力を正しい方法でキャプチャできます。
combine.sh time sleep 1 &> /dev/null
(出力は表示されません-正しい)
別の結合スクリプトを使用せずに私が望むものを達成する方法はありますか?
この質問は BashFAQ/032 で扱われます。あなたの例では、あなたは:
{ time sleep 1; } 2> /dev/null
理由
time sleep 1 2>/dev/null
その構文では、time
コマンドsleep 1 2>/dev/null
(はい、コマンドsleep 1
withstderrは/dev/null
)にリダイレクトされます。組み込みのtime
は、これを実際に可能にするためにそのように機能します。
bash
builtinは実際にこれを行うことができます。なぜなら...まあ、それはビルトインだからです。このような動作は、通常/usr/bin
にある外部コマンドtime
では不可能です。確かに:
$ /usr/bin/time sleep 1 2>/dev/null
$
今、あなたの質問への答え
一部のLinuxプログラムの出力がSTDOUTにもSTDERRにも送信されないのはなぜですか?
is:それは、出力がstdoutまたはstderrに送られます。
お役に立てれば!
time
ビルトインに関する特定の質問に回答しましたが、stdout
にもstderr
にも書き込まないコマンドがいくつかあります。典型的な例は、Unixコマンド crypt
です。引数のないcrypt
は、標準入力stdin
を暗号化し、それを標準出力stdout
に書き込みます。 getpass()
を使用してユーザーにパスワードの入力を求めます。これにより、デフォルトで_/dev/tty
_にプロンプトが出力されます。 _/dev/tty
_は現在の端末デバイスです。 _/dev/tty
_への書き込みには、現在の端末への書き込みと同じ効果があります(存在する場合は、isatty()
を参照してください)。
crypt
がstdout
に書き込めない理由は、暗号化された出力をstdout
に書き込むためです。また、ユーザーがstderr
とstdout
をリダイレクトした場合でもプロンプトが表示されるように、stderr
に書き込むのではなく_/dev/tty
_にプロンプトを表示することをお勧めします。 (同じ理由で、crypt
は、暗号化するデータの読み取りに使用されているため、stdin
からパスワードを読み取ることができません。)
_time sleep 1 > /dev/null 2>&1
_#「スリープ」の出力をリダイレクトしてnullにします。次に、「time」はリダイレクトなしで独自の出力を書き込みます。 「time (sleep 1 > /dev/null 2>&1)
」のようなものです。
_(time sleep 1) > /dev/null 2>&1
_#「timesleep 1」を実行し、その出力をnullにリダイレクトします。
[] s