我有两个脚本定期发出单个字符串来记录文件,我需要tail -f
并排组合我正在使用的paste
.这是可行的,但我无法将输出通过管道传输到另一个tail -f
,以便我可以获得并排粘贴的两个字符串的连续输出。
为了说明/重现问题,我有以下脚本:
p1.sh:
#!/bin/bash
i=0
while true
do
i=$((i+1))
sleep 4
echo "P1string$i" >> out1.log
done
p2.sh:
#!/bin/bash
i=0
while true
do
i=$((i+1))
sleep 4
echo "P2string$i" >> out2.log
done
我在后台运行它们,如下所示:
$ ./p1.sh &
$ ./p2.sh &
现在,这有效:
paste <(tail -f out1.log) <(tail -f out2.log)
但这不起作用:
paste <(tail -f out1.log) <(tail -f out2.log) | tail -f
原则上,这只是管道标准输出tail -f
并且应该可以工作!不?
答案1
要回答你的问题“原则上,这只是通过管道将 stdout 传输到 tail -f 并且应该可以工作!不?”,答案确实是“不”。
该tail
命令旨在给出文件或标准输入的最后 10 行输出。在管道上使用时,它将等待管道关闭,然后打印出它缓冲的最后 10 行。在您的示例中,管道永远不会关闭,因此 tail 永远不会打印出任何内容。
证明这一点的一个简单测试是while true; do echo "Hello"; done | tail -f
,它也永远不会打印任何内容。
答案2
您是否希望将它们并排放置...尝试一下
paste file1.txt file2.txt > merged.txt
或者如果你想将它们分隔开
paste -d ',' file1.txt file2.txt > merged.txt