到目前为止,我知道管道机制是一种连接一系列命令的方法,通过将一个命令的标准输出连接到下一个命令的标准输入,直到到达最后一个命令,将其标准输出与显示器或文件连接。
但是,是否可以对命令进行循环,以便最后一个命令的标准输出连接到第一个命令的标准输入,并且也许通过使用 tee 以某种方式可以显示某个输出的变化值?
答案1
我不确定所有 shell 都存在这种情况,但在 Bash 中这是可能的,尽管不是使用未命名管道。所以不是使用符号|
。但是如果你创建一个命名管道:
mkfifo fifo
然后你就可以使用它:
<fifo cat | cat >fifo &
现在管道在后台运行,但不执行任何操作。但如果从管道外部给管道输送:
echo x >fifo
管道将畅通无阻并永远继续下去。或者直到您排空管道:
cat fifo
输出将出现一次:
x
为了使这个有点复杂,管道可能是这样的:
<fifo cat | xargs -I@ echo @x >fifo &
因此它会x
在每次迭代时向输出添加一个。当然会,但只有在迭代开始后,即管道一解除阻塞,即有东西可读时。和之前一样,这可以手动启动:
echo x >fifo
现在看看top
显示了什么。cat
和应该都有相当多的活动xargs
。
x
和以前一样,如果你排空管道,你应该在终端看到很多s,管道就会阻塞。
这是一个有效的问题,为什么管道会被排空。为什么cat
在终端中提交的命令在电路中没有留下任何内容。我不知道这个。
答案2
好吧,你当然可以只创建一个循环并使用变量:
while true; do
a=$(echo "$a" | grep "Hey" | cut -d" " -f2 | tee -a log)
done
这将保存最后的输出,该输出将在开始时再次使用
答案3
作为现有的答案,如果不使用命名管道(使用创建的MKFIFO(1))。但你可以用 C 语言来做;例如这是我的肮脏简单的实现,甚至没有等待进程退出。
我希望这个信息对您有所帮助。