一部の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
(出力が表示されない-正しい)
別の結合スクリプトを使用せずに、私が望むものを達成する方法はありますか?
2>&1 > /dev/null
つまり、「2は1に移動します(つまり、デフォルトでは端末)、1は/ dev / nullに移動します(ただし2はまだ端末に移動します!)。>/dev/null 2>&1
」 「1は/ dev / nullに移動し、2は1の移動先に移動します(つまり、/ dev / nullにも移動します)。組み込みの「時間」はリダイレクトされないため、ここではまだ機能しませんが、より一般的には正しいです(たとえば、/ usr / bin / timeを使用すると機能します)。1に行かない2として、2に1の「方向」をコピーして考えてみて「2>&1」