【问题标题】:Redirect a Named Pipe in a perl loop在 perl 循环中重定向命名管道
【发布时间】:2019-11-11 10:59:55
【问题描述】:

有一个命名管道作为源

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

【问题讨论】:

  • 我认为cat 正在等待EOF 标记,因此在此之前它不会打印任何内容。尝试在shell1中按CTRL-D,然后输出到达shell2

标签: bash perl pipe named-pipes


【解决方案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

【讨论】:

  • 或者根本不使用 cat 。 perl -ne 'blah' ~/myfifo
  • @Håkon Brilliant。太棒了,你解决了我的问题。非常感谢您的帮助和时间。
  • @Shawn 这个例子没用,只是为了证明缺少的输出。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-11
  • 1970-01-01
  • 1970-01-01
  • 2010-12-29
  • 1970-01-01
相关资源
最近更新 更多