首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >awk中的共过程和双向管道

awk中的共过程和双向管道
EN

Unix & Linux用户
提问于 2023-02-13 19:21:59
回答 1查看 96关注 0票数 0

我试图理解command | getline varcommand |& getline var之间的区别。我应该用哪一种?一直在阅读关于共进程和双向管道的文章,但是需要一些解释,因为事情变得相当混乱。

实际上,我使用的是

代码语言:javascript
复制
kmd=sprintf("%s%d\n", "tput bold; tput setaf ", knum)
tseq[knam] = ( (kmd | getline outp) > 0 ? outp : "<" knam ">" )
close(kmd)

这里的共同过程是什么?是在使用tput吗。我认为在代码中只有一个单向的管道通信。使用kmd |& getline outp的好处是什么,我应该使用后者吗?

EN

回答 1

Unix & Linux用户

回答已采纳

发布于 2023-02-13 21:07:23

不,你应该继续使用简单的“\”。如果您的任务是:向外部工具提供一些数据,并使用该工具提供的结果。那么一个简单的单向管道就足够了。

只有在下列情况下才需要双向管道:

  • 您希望将外部工具的相同实例保存在内存中,用于您自己进程的整个生命周期。
  • 您要发送到外部工具的数据在逻辑上被拆分为数据包。
  • 您需要在发送下一个数据包之前接收处理一个数据包的结果。
  • 您需要根据上一包的结果调整下一包数据(S)

如果这四个问题之一是“否”-你不需要双向管道。

很难创造一个真实的例子,在那里,这种双向管道可能是有用的。它可能被发明用于一些数据库查询工具或web应用程序。但是在绝大多数情况下,如果需要使用某种服务器,这些任务通常是用perlpython甚至shell之类的语言解决的。awk通常只用于文本处理.

这里有一个不现实的,但技术上正确的例子:

代码语言:javascript
复制
#!/bin/gawk
BEGIN {
  tool="bc"

  print "2+3" |& tool
  tool |& getline res

  if (res>4)
     print "5+6" |& tool
  else 
     print "10+45" |& tool
  tool |& getline res

  close(tool, "to")

  print res
}

正如您在这里看到的,第一个打印将一个“查询”发送到外部工具(在这种情况下,简单的计算器bc )。然后,根据第一个查询的结果,发送另一个查询,最后打印结果。它是处理两个查询的工具的同一个实例。它从第一个print "2+3" |& command打开到特殊语句close(command, "to")

票数 1
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/735418

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档