bash - 交换两个程序的输入和输出

标签 bash redirect stdout stdin

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

改写后的标题是“我希望程序 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/

相关文章:

linux - Linux Bash 脚本可以响应安装选项吗

bash - <<END_SCRIPT 同时通过 bash 连接到 FTP

android - Firebase - 动态链接不适用于 Android 12

php - CodeIgniter 内部重定向

perl - Dancer 中的重定向和恢复 STDERR

bash - 如何在 bash 中访问名称中有空格的环境变量?

java - 从bash脚本中获取JVM执行状态

perl - 如何在 perl 中禁用 stdout 重定向到文件缓冲?

c++ - 将函数输出重定向到/dev/null

python - 如何将 stdout 重定向到 Tkinter Text 小部件