我只是在终端里玩,我这样做了:
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
答案1
/dev/fd/0
是当前进程的标准输入;tee
将其输入写入您提供的文件和标准输出。读取tee
一行(空白),然后将该行写入 stdout ( sed
) 及其自己的输入,其中它读取刚刚写入的行,将其写入 stdout 及其自己的输入,等等,创建一个无限循环 (空)行*。该sed
命令仅打印行号,然后打印行。
echo --> tee --> sed
^---+
* 当提供的输入不仅仅是一个简单的输入时echo
,此命令将循环输入,一遍又一遍地重复。
注意:OSX (BSD) 不允许您写入/dev/fd/0
,因此您不能执行此操作。