是否可以使用管道或其他方式构建命令循环?

sha*_*ant 3 command-line pipe

到目前为止,我知道管道机制是连接一系列命令的一种方式,它通过将一个命令的 stdout 连接到下一个命令的 stdin 直到到达最后一个命令,这将其 stdout 与显示或文件连接起来。

但是,是否有可能对命令进行循环,以便最后一个命令的标准输出连接到第一个命令的标准输入,并且可能通过使用 tee 以某种方式显示某个输出的变化值?

小智 6

我不确定那里有所有的外壳,但在 Bash 中这是可能的,尽管不能使用未命名的管道。所以不是|符号。但是如果你创建一个命名管道:

mkfifo fifo
Run Code Online (Sandbox Code Playgroud)

然后你可以使用它:

<fifo cat | cat >fifo &
Run Code Online (Sandbox Code Playgroud)

现在管道在后台工作,但什么也不做。但是,如果您从管道外部喂入管道:

echo x >fifo
Run Code Online (Sandbox Code Playgroud)

管道将畅通无阻并永远持续下去。或者直到您排空管道:

cat fifo
Run Code Online (Sandbox Code Playgroud)

输出将出现一次:

x
Run Code Online (Sandbox Code Playgroud)

为了使这有点复杂,管道可能是这样的:

<fifo cat | xargs -I@ echo @x >fifo &
Run Code Online (Sandbox Code Playgroud)

所以它会x在每次迭代时向输出添加一个。当然会,但只有在迭代开始后,即一旦管道解除阻塞,即有可读取的内容。和以前一样,这可以手动启动:

echo x >fifo
Run Code Online (Sandbox Code Playgroud)

现在看看什么top显示。应该有相当多的两个活动的catxargs

和之前一样,如果你把管道排空,你应该会x在终端看到很多s,管道会阻塞。

这将是一个有效的问题,为什么管道会被排干。为什么cat在终端中提交的命令不会在电路中留下任何东西。我不知道这个。

  • 这在很大程度上取决于标准 IO 缓冲区的大小。如果管道两部分之间的任何数据超过缓冲区大小,管道就会阻塞。 (3认同)

ADD*_*DDB 2

好吧,你当然可以只创建一个循环并使用变量:

while true; do
    a=$(echo "$a" | grep "Hey" | cut -d" " -f2 | tee -a log)
done
Run Code Online (Sandbox Code Playgroud)

这将保存最后的输出,该输出将在开始时再次使用

  • 我不确定这是否回答了实际的问题:这是一种完全不同类型的循环。 (2认同)