如何将bash输出写入任意程序stdin

时间:2016-09-28 17:36:33

标签: linux bash shell io

我希望(希望很容易)从bash脚本写入任何已经通过该程序的stdin运行的任意程序。

假设我有一些任意程序" Sum",它不断地从终端获取用户输入。它从stdin接收的每个整数都会添加到当前总和并输出新的总和。这是我的意思的终端文字示例:

$: ./Sum
Sum: 0
Give me an integer: 2
Sum: 2
Give me an integer: 5
Sum: 7

如何在bash脚本中自动执行此过程?如果我控制了Sum的源代码,我可以让它接受整数参数。但是,如果我已经控制了该程序,我怎样才能自动与Sum进行交互?这是我想要要执行的bash片段的伪代码:

在example.sh中:

#!/bin/bash
my_program_input_point=./Sum &
echo 2 > my_program_input_point
echo 5 > my_program_input_point

因此,在我的终端屏幕上,它仍然是这样的:

$: ./example.sh
Sum: 0
Give me an integer: 2
Sum: 2
Give me an integer: 5
Sum: 7

不同之处在于我不会输入任何内容。

感觉这个任务应该非常简单,因为基本上你可以在终端中做任何事情,你也可以轻松地在脚本中完成。显然,一旦开始就直接与任意过程交互。

This topic通过使用管道回答了我的问题的某些方面。然而,只有当我控制管道两侧的两个程序时,接受的答案才有效,即收件人"程序没有义务自动读取管道。

这是假设我无法修改有问题的程序/脚本。我也不能写一个"管道阅读器"脚本包装程序(Sum),因为仍然需要包装脚本与正在运行的进程Sum进行交互。

this question on serverfault.com的第二个答案(由jfgagne撰写)似乎更接近,但我似乎无法让它发挥作用。是否有任何更容易的方法可以做到这一点我还不知道?

有关如何捕获和阅读任意程序输出的信息,请参阅我的下一个question以获取更多信息

3 个答案:

答案 0 :(得分:3)

最直接的方法是使用管道。诀窍是你可以使管道的左侧成为复合语句或函数调用。它不一定只是一个命令。

{
    echo 2
    echo 5
} | ./Sum

numbers() {
    echo 2
    echo 5
}

numbers | ./Sum

这使您可以执行任何想要生成输入的内容。你不必提前拥有这一切。如果逐位产生输入,它将逐位送入./Sum

答案 1 :(得分:0)

您可以使用命名管道。无论什么开始Sum负责创建一个方便的命名管道,然后以命名管道作为标准输入启动Sum

mkfifo /tmp/pipe
Sum < /tmp/pipe

然后您的脚本可以将管道的名称作为参数,然后将其视为可以写入的文件。

#!/bin/bash
p=$1

echo 2 > "$p"
echo 5 > "$p"

然后你可以用client /tmp/pipe调用你的脚本。

答案 2 :(得分:0)

您可以写入正在运行的进程的标准输入文件描述符。这是同一个问题:https://serverfault.com/questions/178457/can-i-send-some-text-to-the-stdin-of-an-active-process-running-in-a-screen-sessi

您需要写入/proc/*pid of the program*/fd/0,这是pid进程标准输入的文件描述符。确保您有权这样做。