我希望 的输出A
作为 的输入B
,同时 的输出B
作为 的输入A
,可以吗?
我尝试了一个简单粗暴的方法:为A
( pipeA
) 和B
( pipeB
) 创建命名管道,然后:
pipeB | A | pipeA &
pipeA | B | pipeB &
但这不起作用(pipeB
是空的并且切换顺序也无济于事)。
任何帮助,将不胜感激。
例子:
命令A
可以是该 C 程序的编译形式:
#include <stdio.h>
int main()
{
printf("0\n");
int x = 0;
while (scanf("%d", &x) != EOF)
{
printf("%d\n", x + 1);
}
return 0;
}
命令B
可以是该 C 程序的编译形式:
#include <stdio.h>
int main()
{
int x = 0;
while (scanf("%d", &x) != EOF)
{
printf("%d\n", x + x);
}
return 0;
}
答案1
我希望 A 的输出作为 B 的输入,同时 B 的输出作为 A 的输入,可以吗?
我不明白这是怎么可能的。
如果两个过程互相依赖为了生成输出,进程 B 将等待直到进程 A 产生一些输出,但是进程 A 直到获得来自进程 B 的输入才会生成任何输出。
两个进程都会永远阻塞。
编辑:
OP 在下面评论了一个不同的情况,其中进程 A 生成一些输出,然后等待进程 B 的输入,而进程 B 只是等待进程 A。
在这种情况下,我们可以使“相互管道”发挥作用。创建两个脚本:
/tmp/multualpipingA
(该脚本生成一些输出echo process A
并等待):
#!/bin/bash
echo process A
while read; do
echo process A says: \"$REPLY\"
sleep 1
done < /dev/stdin
并且/tmp/multualpipingB
(该脚本仅对输入做出反应):
#!/bin/bash
while read; do
echo process B says: \"$REPLY\"
sleep 1
done < /dev/stdin
现在打开两个终端会话“1”和“2”,并按以下顺序输入:
session1$ mkfifo /tmp/fifo{A,B}
session1$ cat /tmp/fifoB | /tmp/multualpipingB | tee /tmp/fifoA
Enter
session2$ cat /tmp/fifoA | /tmp/multualpipingA | tee /tmp/fifoB
Enter
您将看到以下输出:
process A
process A says: "process B says: "process A""
process A says: "process B says: "process A says: "process B says: "process A""""
和这个:
process B says: "process A"
process B says: "process A says: "process B says: "process A"""
process B says: "process A says: "process B says: "process A says: "process B says: "process A"""""
(在 OS X 10.8.2 “Montain Lion” 上测试)
答案2
如果您有以下情况,请尝试这样做狂欢:
command | tee >(command1) | tee >(command2)
它的名字是流程替代
现实生活©®™示例:
$ echo foobar | tee >(grep -o "f") | tee >(grep -o "r")
foobar
r
f
$
看http://mywiki.wooledge.org/ProcessSubstitution或者http://mywiki.wooledge.org/BashFAQ/024供共同使用。