【问题标题】:Interchanging two programs inputs and outputs交换两个程序的输入和输出
【发布时间】:2013-08-10 05:18:03
【问题描述】:

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

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

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

有什么帮助吗?

【问题讨论】:

  • 那会是递归调用吗?你能详细说明一下吗?谢谢。
  • 这将是一个递归调用,它将一直持续到程序 Y 给出输出或 W 或 L

标签: bash redirect stdout stdin


【解决方案1】:

您可以使用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

【讨论】:

  • 你能解释一下它的实际作用吗?这会对我们有很大帮助。谢谢!
  • 如何删除xy_pipe
  • 你在答案的最后一行删除它
  • 我还想要屏幕上的 2 个程序输出。它不会发生
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-08
  • 1970-01-01
  • 2023-03-20
  • 1970-01-01
相关资源
最近更新 更多