我试图理解command | getline var和command |& getline var之间的区别。我应该用哪一种?一直在阅读关于共进程和双向管道的文章,但是需要一些解释,因为事情变得相当混乱。
实际上,我使用的是
kmd=sprintf("%s%d\n", "tput bold; tput setaf ", knum)
tseq[knam] = ( (kmd | getline outp) > 0 ? outp : "<" knam ">" )
close(kmd)这里的共同过程是什么?是在使用tput吗。我认为在代码中只有一个单向的管道通信。使用kmd |& getline outp的好处是什么,我应该使用后者吗?
发布于 2023-02-13 21:07:23
不,你应该继续使用简单的“\”。如果您的任务是:向外部工具提供一些数据,并使用该工具提供的结果。那么一个简单的单向管道就足够了。
只有在下列情况下才需要双向管道:
如果这四个问题之一是“否”-你不需要双向管道。
很难创造一个真实的例子,在那里,这种双向管道可能是有用的。它可能被发明用于一些数据库查询工具或web应用程序。但是在绝大多数情况下,如果需要使用某种服务器,这些任务通常是用perl、python甚至shell之类的语言解决的。awk通常只用于文本处理.
这里有一个不现实的,但技术上正确的例子:
#!/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")。
https://unix.stackexchange.com/questions/735418
复制相似问题