【问题标题】:Taking output of one program into input of another one in Bash在 Bash 中将一个程序的输出转换为另一个程序的输入
【发布时间】:2016-09-27 01:08:00
【问题描述】:

假设我有两个程序:program1 和 program2。 我想把program1的输出,放到program2的输入,然后把program2的输出,放到program1的输入等等。

执行此操作的 bash 脚本应该是什么样子? 我已经阅读了很多关于管道和输入/输出重定向的内容,但我仍然不确定。是否可以一个管道同时用于program2的输入和输出,而另一个管道用于program2?

我写过这样的东西:

PIPE=$(mktemp -u)
mkfifo $PIPE
exec 3<>$PIPE
rm $PIPE 
cat <&3 >&3 &

但是当我想像这样运行 program1 和 program2 时:

cat <&3 | ./program1 >&3 &
cat <&3 | ./program2 >&3 &

它不起作用。任何线索我该怎么办? 提前谢谢你:)

【问题讨论】:

  • 你在后台运行它...

标签: linux bash input output


【解决方案1】:

是的,我们可以使用 FIFO 将管道的输出循环回其输入。方法如下。

首先,让我们创建一个fifo(命名为pipe):

$ mkfifo pipe

为了演示的目的,我们还要创建在管道中使用的 shell 函数:

$ p1() { while read a; do sleep 0.1; echo "$((a+1))"; done; }
$ p2() { while read b; do echo "$((b+1))"; done | tee /dev/stderr; }

现在,让我们用p1 将其输出发送到p2 来运行它们,p2 将其输出发送到pipep1 的输入将反馈到p1

$ { echo 1; cat pipe; } | p1 | p2 >pipe
3
5
7
9
11
13
^C

循环会一直持续下去,但我先用 ctrl-C 终止了它。 p1 将其输入加一,p2 将其输入加一。我们看到的输出来自p2的stderr流。

工作原理

{ echo 1; cat pipe; }p1 提供输入。它提供一个1 作为种子值,然后提供它从pipe 接收到的任何内容。

p1 的工作原理如下:

while read a
do
    sleep 0.1
    echo "$((a+1))"
done

它从输入中读取,等待 0.1 秒,然后将递增的值写入其标准输出。短暂等待的目的是使输出不会在屏幕上滚动得太快。

p2 的工作原理如下:

while read b
do
    echo "$((b+1))"
done | tee /dev/stderr

就像p1 一样,它从标准输入读取数据并将一个递增的值写入标准输出。为了让我们可以看到终端上发生了什么,这也将输出的副本发送到 stderr。

【讨论】:

    猜你喜欢
    • 2015-08-31
    • 1970-01-01
    • 2010-10-02
    • 2010-11-27
    • 1970-01-01
    • 1970-01-01
    • 2011-08-28
    • 2017-07-24
    • 2021-11-20
    相关资源
    最近更新 更多