此命令不向file2输出任何内容:
#!/bin/bash
echo content > file1
tail -f file1 | perl -pe '$_' > file2
这些命令可以正常工作:
tail -f file1 > file2
tail -f file1 | perl -pe '$_'
tail file1 | perl -pe '$_' > file2
tail -f /tmp/file1 | while read line; do echo $line | perl -pe '$_' > /tmp/file2 ; done
任何人都知道发生了什么?
答案 0 :(得分:5)
perl
检测到stdout不是终端。为了提高效率,它会一直等到要写入完整的数据块。由于您不提供更多数据,因此在tail
退出并且程序可以完成之前不会写任何内容。
您enable autoflushing可以使用$|++
:
tail -f file1 | perl -pe '$|++; $_' > file2
答案 1 :(得分:2)
没有输出的那个会受到缓冲输出和非终止的影响。 tail -f
永远不会退出,永远等待file1
成长。但是,perl
的输出(显然)是缓冲的,所以它等到它有一些最小量的输出(超过一行包含“内容”)才能实际写入file2
。在生成更多输出或退出perl
之前,输出仍保持未刷新状态。
每个工作示例要么终止,要么刷新当时的任何缓冲输出;或者它的输出是无缓冲的,允许它在生成时显示。