交换两个程序输入和输出

时间:2013-08-10 05:18:04

标签: bash redirect stdout stdin

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

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

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

任何帮助?

1 个答案:

答案 0 :(得分:3)

您可以使用named pipe

执行此操作
mkfifo xy_pipe
./program_x < xy_pipe | ./program_y > xy_pipe

常规管道用于将x的stdout连接到y的stdin。

要将y的stdout连接到x的stdin,我们使用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