如何检查GNU awk coprocess是否已打开,或在不写入内容的情况下强制打开?

3
我有一个使用coprocess的gawk程序。然而,有时我没有数据写入coprocess,我的原始脚本会在等待coprocess输出时挂起。
下面的代码从STDIN读取每行内容,并将其写入作为coprocess运行的“cat”程序。然后它读取coprocess输出并将其写入STDOUT。如果将if条件更改为1==0,则不会向coprocess写入任何内容,该程序将在while循环中挂起。
手册中看来,只有第一次使用|&运算符进行IO操作时,coprocess和双向通信通道才会启动。也许我们可以在实际上没有写任何内容的情况下启动它们(例如写入空字符串)?或者有没有一种方法可以检查coprocess是否启动了?
#!/usr/bin/awk -f
BEGIN {
    cmd = "cat"
##  print "" |& cmd
}

{
    if (1 == 1) {
       print |& cmd
    } 
}

END {
    close (cmd, "to")
    while ((cmd |& getline line)>0) {
       print line
    }
    close(cmd)
}

对于阅读此问题的人,我建议将标签“gawk”作为“awk”的同义词。这是一个错误,请随意在http://stackoverflow.com/tags/awk/synonyms中投票反对该请求,以便撤销它。谢谢! - fedorqui
我有一些问题...你实际上想要实现什么?out"to"是什么?在尝试读取其输出之前,您似乎关闭了协处理器 - 这似乎不明智? - Mark Setchell
@MarkSetchell他只关闭进程的“to”端(在从“from”端读取之前)。看起来你需要阅读gawk手册!@DavidR我的问题是:你期望“cat”输出什么?你认为out是什么意思?你试图通过多余的1 == 1实现什么目的? - ooga
你可以在while循环开始时测试打印到辅助处理器的相同条件吗?类似 while( condition && ((cmd |&... )的内容。 - n0741337
@ooga,@MarkSetchell,“out”是一个错误。我现在已经编辑了代码。1==1没有意义,只是为了让我尝试解释一下,如果该行不运行(例如通过将条件更改为1==0),那么while循环就会挂起。 - DavidR
1个回答

4

很好的问题,给你加一分!

只需测试close(cmd,"to")的返回代码-如果管道打开,则为零,否则为-1(或其他值)。例如:

if (close(cmd, "to") == 0) {
   while ((cmd |& getline line)>0) {
      print line
   }
   close(cmd)
}

1
太好了!非常感谢。 - DavidR

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接