Io-Redirection

為什麼不同重定向方式的命令執行時長會有差異?

  • June 3, 2017

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,您將刪除標準輸出,然後將標準錯誤發送到發送標準輸出的位置,…即,您將同時刪除兩者。這不會輸出任何東西,因此將是所有命令中最快的。

引用自:https://unix.stackexchange.com/questions/368240