find
一般ユーザーとしてスケジュールされたコマンドを実行しています。
私が知っているすべては、リダイレクトがstdout / stderrメッセージが端末に表示されるのを防ぐことです。それでは、さまざまなリダイレクト方法にかかる時間が異なるのはなぜですか? ttyの書き込み速度に関連していますか?それとも、その背後に他の理由がありますか?誰でもこれを理解するために正しい方向を教えてもらえますか?
$ id
uid=1000(user1) gid=1000(user1) groups=1000(user1),1001(user2)
$time find /
<truncated output>
real 0m13.902s
user 0m0.197s
sys 0m0.448s
$ time find / >/dev/null
<truncated output>
real 0m0.298s
user 0m0.068s
sys 0m0.206s
$time find / 2> /dev/null
<truncated output>
real 0m13.279s
user 0m0.181s
sys 0m0.405s
$ time find / > /dev/null 2>&1
real 0m0.306s
user 0m0.109s
sys 0m0.174s
ベストアンサー1
プロセス(find
)が実際に出力を作成する必要がある場合は、その出力を削除するように指示するよりもはるかに長い時間がかかります。
を使用すると、
find /
stdoutとstderrの両方が端末に送信され、それを記録する必要があります(実際の結果やすべての許可エラーなど)。を使用すると、
time find / >/dev/null
コマンドの標準出力が削除されますが、まだエラー(存在する場合)が印刷されます。あなたの結果を見ると、合法的な結果が多く、エラーはほとんどありません。を使用すると、
time find / 2> /dev/null
コマンドの標準出力は依然として端末に送信されますが、stderrを削除するだけです。ファイルシステムを介して読み取り権限がないことがわかると、実際には非常に高速です。を使用すると、
time find / > /dev/null 2>&1
標準出力を削除し、標準出力が送信される場所に標準エラーを送信します。つまり、両方を削除します。これは何も出力しないので、すべてのコマンドの中で最も高速です。