Io-Redirection
將管道輸出到頭/尾所需的時間
一個目錄中有很多txt文件。
如果我這樣做
time wc -l *.txt | head
需要real 0m0.032s user 0m0.020s sys 0m0.008s
如果我這樣做
time wc -l *.txt | tail
需要real 0m0.156s user 0m0.076s sys 0m0.088s
這是否意味著它
wc
會事先知道它正在流向頭部並且只會計算前 10 個文件並節省時間?換句話說,它知道管道嗎?這是特殊的wc
東西還是適用於所有標準/內置命令?
我
strace
對這兩個命令都做了一個。有趣的是,當您通過管道輸出時,head
只有 123 個系統呼叫。另一方面,當管道傳輸到尾部時,系統呼叫有 245 個(當有更多 *.txt 文件時,系統呼叫會更多)。案例:頭部
以下是管道傳輸到的最後幾行
head
:open("file12.txt", O_RDONLY) = 3 fadvise64(3, 0, 0, POSIX_FADV_SEQUENTIAL) = 0 read(3, "", 16384) = 0 write(1, "0 file12.txt\n", 13) = -1 EPIPE (Broken pipe) --- SIGPIPE (Broken pipe) @ 0 (0) --- +++ killed by SIGPIPE +++
當
wc
嘗試寫入第 12 個文件的輸出時,會出現錯誤EPIPE
。這就是為什麼head
在獲得第 11 行後退出的原因。head
退出時,wc
獲取SIGPIPE
. 如上面的 strace 輸出所示,wc
首先嘗試寫入該管道(head
不再從中讀取)並收到管道損壞的錯誤。SIGPIPE 信號在程序嘗試寫入管道而沒有連接到另一端的程序時被發送到程序。——來自維基百科
案例:尾巴
當管道傳輸到
tail
時,上面沒有類似的東西。wc 在將所有輸出寫入tail
需要一直連接的管道後優雅地結束。tail
需要所有行才能列印最後 10 行。當沒有更多輸出要讀取時,tail
列印行並優雅退出