在Unix中粘贴没有临时文件

时间:2009-10-15 00:37:46

标签: unix shell redirect pipe

我正在尝试使用Unix命令粘贴,这就像是一个附加列的猫形式,并且遇到了一个我从未知道如何在Unix中解决的难题。

如何使用两个不同程序的输出作为另一个程序的输入(不使用临时文件)?

理想情况下,我会这样做(不使用临时文件):

./ progA> TMPA; ./progB> tmpB;粘贴tmpA tmpB

这似乎对我来说相对频繁,但我无法弄清楚如何使用两个不同程序( progA progB )的输出作为输入不使用临时文件( tmpA tmpB )。

对于像粘贴这样的命令,只需使用粘贴$(。/ progA)$(。/ progB)(用bash表示法)就不会有效,因为它可以从文件或stdin中读取

我对临时文件持谨慎态度的原因是我不想让并行运行的作业因使用同一个文件而导致问题;确保唯一的文件名有时很难。

我目前正在使用bash,但很想知道任何Unix shell的解决方案。

最重要的是,我是否以正确的方式解决问题?


干杯!

4 个答案:

答案 0 :(得分:52)

你不需要bash下的临时文件,试试这个:

paste <(./progA) <(./progB)

请参阅Bash手册中的"Process Substitution"

答案 1 :(得分:3)

使用这样的命名管道(FIFO):

mkfifo fA
mkfifo fB
progA > fA &
progB > fB &
paste fA fB
rm fA fB

Bash的进程替换透明地执行类似的操作,所以只有在你拥有不同的shell时才使用它。

答案 2 :(得分:2)

天啊,我最近发现,在某些情况下,如果你在bash脚本中设置以下内容,你可以让你的进程替换工作(如果你需要):

设置+ o posix

http://www.linuxjournal.com/content/shell-process-redirection

来自链接: &#34;流程替换不是POSIX兼容功能,因此可能必须通过以下方式启用:set + o posix&#34; 我被困了好几个小时,直到我做完了。希望这个额外的花絮会有所帮助。

答案 3 :(得分:-1)

适用于所有炮弹。

{
progA
progB
} | paste