在perl循环中重定向命名管道

时间:2019-06-30 11:51:50

标签: bash perl pipe named-pipes

将命名管道作为源

shell1> mkfifo ~/myfifo
shell1> tee -a ~/myfifo
ciao

以下命令为什么不输出任何消息?

shell2> cat ~/myfifo | perl -ane 'print "testa\n"' | cat

删除最后一条命令时,所有命令均按预期运行

shell2> cat ~/myfifo | perl -ane 'print "testa\n"'
testa

1 个答案:

答案 0 :(得分:1)

当Perl进程的STDOUT未连接到tty时,自动刷新功能将关闭。将Perl进程的输出通过管道传输到cat而不是将其打印到终端时,就是这种情况。这会导致cat命令挂起,等待来自Perl进程的输入。

您可以通过为STDOUT打开自动刷新来解决此问题:

cat ~/myfifo | perl -ane 'STDOUT->autoflush(1); print "testa\n"' | cat 

或者,您可以使用unbuffer命令:

cat ~/myfifo | unbuffer -p perl -ane 'print "testa\n"' | cat