2

我的问题的标题颇具误导性,但我找不到更好的标题。

改写后的标题是“我希望程序 x 的输出是程序 y 的输入,程序 y 的输出是程序 x 的输入。程序 x 将从提供输出开始,而程序 y 将从接受输入开始。”

Program x
        stdout --> <Program y>stdin
        stdin  --> <Program y>stdout

有什么帮助吗?

4

1 回答 1

3

您可以使用命名管道执行此操作:

mkfifo xy_pipe
./program_x < xy_pipe | ./program_y > xy_pipe

常规管道用于将 x 的标准输出连接到 y 的标准输入。

要将 y 的标准输出连接到 x 的标准输入,我们使用 . 创建第二个命名管道mkfifo。命名管道是一种以正常方式连接两个进程的显式方式|。每当一个进程写入命名管道时,它都会阻塞,直到另一个进程从管道中读取。虽然xy_pipe看起来是一个文件,但实际上没有数据写入磁盘。

例子:

$ cat program_x
#!/bin/bash
echo foo
read line && echo "program_x: read '$line'" >&2

$ cat program_y
#!/bin/bash
read line && echo "program_y: read '$line'" >&2
echo bar

$ mkfifo xy_pipe
$ ./program_x < xy_pipe | ./program_y > xy_pipe
program_y: read 'foo'
program_x: read 'bar' 

完成后不要忘记删除xy_pipe

$ rm xy_pipe

如果您想在屏幕上看到这两个程序的输出,您可以通过添加tee到混合中来做到这一点。

$ mkfifo xy_pipe
$ ./program_x < xy_pipe | tee /dev/stderr | ./program_y | tee xy_pipe
foo
program_x says: foo
bar
program_y says: bar
于 2013-08-10T05:40:08.933 回答