无底T恤?

无底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+ 行了。我在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

答案1

/dev/fd/0是当前进程的标准输入;tee将其输入写入您提供的文件和标准输出。读取tee一行(空白),然后将该行写入 stdout ( sed) 及其自己的输入,其中它读取刚刚写入的行,将其写入 stdout 及其自己的输入,等等,创建一个无限循环 (空)行*。该sed命令仅打印行号,然后打印行。

echo --> tee --> sed
      ^---+

* 当提供的输入不仅仅是一个简单的输入时echo,此命令将循环输入,一遍又一遍地重复。

注意:OSX (BSD) 不允许您写入/dev/fd/0,因此您不能执行此操作。

相关内容