你的「問題」此刻實際上並沒有提出一個問題,它只是一個觀察。然而,解釋你的觀察。考慮的輸出之間的差別:
$ seq 10 | (head -1 && tail -1)
1
和
$ seq 1000 | (head -1 && tail -1)
1
1000
這到底是怎麼回事?我們的流水線工作如下:
- 發送線(在這種情況下與數字,但其對你的
cat
例如沒有不同)到標準輸出;
閱讀標準輸出,我們有:
- 首先,
head
......它將打印的第一行,然後結束;
- 接下來,一個
tail
...它將開始後頭已運行並打印最後一行。
然而,在默認情況下,head
是不讀通過字符行,甚至字符文件中的行,直到它找到一個換行符,而不是它的讀取數據塊文件(緩衝讀) 。例如,該塊可能是2048個字節。
因此,我們的管道是真的:
- 發送線(在這種情況下,與電話號碼,但它沒有什麼不同您
cat
例子)到標準輸出;
閱讀標準輸出,我們有:
- 首先,
head
......它會讀取從標準輸入第一2KB,打印的第一行,然後結束;
- 接下來,一個
tail
...它會讀取其後的數據之後的第一個2K,因爲它從來沒有看到它。
如果你的目標是隻產生了第一個命令的輸出(您cat
)一次,那麼你可以使用tee
,這樣或許還有:
$ seq 10 | tee >(tail -1) | head -2
也要注意, Linux,你可以改變緩衝的第一個命令,如:
$ stdbuf -oL seq 10 | (head -1 && tail -1)
但這不會工作,如果你的命令其流撥弄(見stdbuf)以下太
對我來說,這似乎並不奇怪......除非輸入大於任何緩衝區大小,否則不太可能出現「head && tail」。 – donkopotamus
@donkopotamus我不知道,你能解釋一下嗎?以及如何讓這個例子的頭部,尾部工作!謝謝! – duqu
你能解釋一下它是如何工作的嗎?每個命令一次加載一個緩衝區,嘗試用該緩衝區終止,然後將剩餘的緩衝區交給下一個命令?通常緩衝區大小有多大?或者我怎麼能找到這個結果? – rubystallion