Io-Redirection
為什麼不同重定向方式的命令執行時長會有差異?
我
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
當您的程序 (
find
) 需要實際寫出輸出時,這顯然比您告訴它丟棄所述輸出要花費更長的時間。
- 當您使用
find /
時,stdout 和 stderr 都會發送到您的終端,並且必須將它們都寫出來(即實際結果和所有權限錯誤等等)- 使用時,
time find / >/dev/null
您將刪除命令的標準輸出,但仍會列印出所有錯誤(如果有的話)。從你的結果來看,你有很多合法的結果和很少的錯誤。- 當您使用
time find / 2> /dev/null
時,該命令的標準輸出仍會發送到您的終端,但現在您只是刪除了 stderr。如果您通過一個您沒有讀取權限的文件系統來查找,這實際上會非常快。- 當您使用 時
time find / > /dev/null 2>&1
,您將刪除標準輸出,然後將標準錯誤發送到發送標準輸出的位置,…即,您將同時刪除兩者。這不會輸出任何東西,因此將是所有命令中最快的。