Shell

無底T卹?

  • July 8, 2014

我只是在終端裡玩耍,我這樣做了:

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+ 行。我在bashdashsh和 中嘗試了這個,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,所以你不能這樣做。

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