Shell
無底T卹?
我只是在終端裡玩耍,我這樣做了:
printf 'some string\n' | { tee /dev/fd/3 | { : && sed 's/some/string/' } } 3>&0
當我看到滿屏的內容時,我真的很驚訝:
string string string string string string ...
它幾乎一直持續下去。我削減了一些,為了更好地展示,也許試試這個:
echo | tee /dev/fd/0 | sed =
對我來說,它呈現如下輸出:
<num> #blank <num+1> #blank ...
等等。有幾次我在我可以擊中的時候嘗試過它
CTRL
+C
我在 200k+ 行。我在bash
、dash
、sh
和 中嘗試了這個,zsh
並且都顯示了相同的結果。那裡發生了什麼?文件描述符如何在
|pipe
我認為的獨立程序之間傳遞?這是可靠和/或預期的行為嗎?還有其他方法可以產生這種效果嗎?以供參考:
echo '#blank' | { uname -r readlink -f /dev/fd/0 tee /dev/fd/0 } | sed '=;5q'
輸出
1 3.14.6-1-ARCH 2 /proc/24925/fd/pipe:[5851017] 3 #blank 4 #blank 5 #blank
/dev/fd/0
是目前程序的標準輸入;tee
將其輸入寫入您提供給它的文件和標準輸出。tee
讀取(空白)行也是如此,然後將該行sed
寫入 stdout(空)行*。該sed
命令只列印行號,然後列印行。echo --> tee --> sed ^---+
- 當提供的輸入不僅僅是一個簡單的
echo
,此命令將循環輸入,一遍又一遍地重複。注意:OSX (BSD) 不允許你寫到
/dev/fd/0
,所以你不能這樣做。