到目前为止,我知道管道机制是连接一系列命令的一种方式,它通过将一个命令的 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
显示。应该有相当多的两个活动的cat
和xargs
。
和之前一样,如果你把管道排空,你应该会x
在终端看到很多s,管道会阻塞。
这将是一个有效的问题,为什么管道会被排干。为什么cat
在终端中提交的命令不会在电路中留下任何东西。我不知道这个。
好吧,你当然可以只创建一个循环并使用变量:
while true; do
a=$(echo "$a" | grep "Hey" | cut -d" " -f2 | tee -a log)
done
Run Code Online (Sandbox Code Playgroud)
这将保存最后的输出,该输出将在开始时再次使用
归档时间: |
|
查看次数: |
6759 次 |
最近记录: |