我的问题的标题相当具有误导性,但我找不到更好的标题。
改写后的标题是“我希望程序 x 的输出成为程序 y 的输入,程序 y 的输出成为程序 x 的输入。程序 x 将从提供输出开始,而程序 y 将从接受输入开始。”
Program x
stdout --> <Program y>stdin
stdin --> <Program y>stdout
有什么帮助吗?
最佳答案
您可以使用named pipe来做到这一点:
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
关于bash - 交换两个程序的输入和输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18158877/