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

Linux 如何将bash输出写入任意程序stdin,linux,bash,shell,io,Linux,Bash,Shell,Io,我希望能够轻松地从bash脚本编写任何已经通过该程序的stdin运行的任意程序 假设我有一些任意的程序总和,它不断地从终端获取用户输入。它从stdin接收到的每个整数都加到当前和中,并输出新和。下面是我的意思的示例终端文本: $: ./Sum Sum: 0 Give me an integer: 2 Sum: 2 Give me an integer: 5 Sum: 7 如何在bash脚本中自动化此过程?如果我能控制Sum的源代码,我可以让它接受整数参数。但是,如果我没有提到对程序的控制,我如

我希望能够轻松地从bash脚本编写任何已经通过该程序的stdin运行的任意程序

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

$: ./Sum
Sum: 0
Give me an integer: 2
Sum: 2
Give me an integer: 5
Sum: 7
如何在bash脚本中自动化此过程?如果我能控制Sum的源代码,我可以让它接受整数参数。但是,如果我没有提到对程序的控制,我如何能够自动化与Sum的交互?下面是我想做的bash片段的psuedo代码:

在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
不同的是我不会打任何的

感觉这项任务应该非常简单,因为基本上你可以在终端上做任何事情,你也可以在脚本中轻松完成。显然,除了在任意进程启动后直接与之交互

通过使用管道回答我问题的某些方面。但是,只有当我控制管道两侧的两个程序时,接受的答案才起作用,接收方程序没有义务自动从管道读取

这是假设我不能修改有问题的程序/脚本。我也不能编写管道读取器脚本来包装程序Sum,因为仍然需要该包装脚本来与正在运行的进程Sum交互

jfgagne写的第二个答案似乎更接近,但我似乎无法让它工作。有没有我不知道的更简单的方法


有关如何捕获和读取任意程序输出的信息,请参阅“我的下一步”了解更多信息

您可以使用命名管道。无论从何处开始,Sum都负责在方便的地方创建命名管道,然后以命名管道作为标准输入开始Sum

mkfifo /tmp/pipe
Sum < /tmp/pipe

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

可以使用命名管道。无论从何处开始,Sum都负责在方便的地方创建命名管道,然后以命名管道作为标准输入开始Sum

mkfifo /tmp/pipe
Sum < /tmp/pipe

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

可以写入正在运行的进程的标准输入文件描述符。同样的问题是:


您需要写入程序*/fd/0的/proc/*pid,该程序是具有该pid的进程的标准输入的文件描述符。确保您有权执行此操作。

您可以写入正在运行的进程的标准输入文件描述符。同样的问题是:


您需要写入程序*/fd/0的/proc/*pid,该程序是具有该pid的进程的标准输入的文件描述符。确保您有权执行此操作。

最简单的方法是使用管道。诀窍在于,您可以使管道的左侧成为复合语句或函数调用。它不必只是一个命令

{
    echo 2
    echo 5
} | ./Sum


这使您可以执行任何要生成输入的操作。你不必提前把一切都准备好。如果您一点一点地生成输入,它将被一点一点地馈送到./Sum。

最简单的方法是使用管道。诀窍在于,您可以使管道的左侧成为复合语句或函数调用。它不必只是一个命令

{
    echo 2
    echo 5
} | ./Sum


这使您可以执行任何要生成输入的操作。你不必提前把一切都准备好。如果您一点一点地生成输入,它将一点一点地馈送到./Sum。

您的示例可以写成printf“%s\n”2 5 |。/Sum。你真的在找别的东西吗?是的,问题是如果你没有我想要发送给Sum的所有输入同时可用。Sum是一个微不足道的例子,所以不太可能发生。但是,如果我想这样做:printf“%s\n”2 5 |[sum的运行实例];其他一些逻辑;printf“%s\n”2 5 |[与前面运行的sum实例相同]然后使用分组:{printf“%s\n”2 5;一些其他内容;printf“%s\n”2 5;}.\sum。为了便于编写,您可以将您的内容放在函数中:mystuff{printf'%s\n'25;其他一些内容;printf'%s\n'25;}并以mystuff |/Sum或脚本的形式运行。无法启动Sum是一个困难的要求,或者这是一个XY问题?刚刚意识到我上面的评论正是John Kugelman在下面的回答中建议的:。您的示例可以写成printf“%s\n”2 5 |/Sum。你真的在找别的东西吗?是的,问题是如果你没有我想要发送给Sum的所有输入同时可用。Sum是一个微不足道的例子,所以不太可能发生。但是,如果我想这样做:printf“%s\n”2 5 |[sum的运行实例];其他一些逻辑;printf“%s\n”2 5 |[同一运行实例
然后使用分组:{printf'%s\n'25;其他一些东西;printf'%s\n'25;}.\sum。为了便于编写,您可以将您的内容放在函数中:mystuff{printf'%s\n'25;其他一些内容;printf'%s\n'25;}并以mystuff |/Sum或脚本的形式运行。无法启动Sum是一个困难的要求,还是这是一个XY问题?刚刚意识到我上面的评论正是John Kugelman在下面的回答中所建议的:。我喜欢这个,而且它肯定更好,可以解决我头脑中看到的一堆用例。但问题是,我生成的所有数字输出都会同时被输入到总和中。如果数字需要根据Sum的输出做出一些决定,我就不能。类似回声2;如果[$sum_output==2];然后回声5fi@durandaltheta:您可以使用协进程:coproc./Sum;{printf'%s'2 5;stuff;printf'%s\n'2 5;}&${COPROC[1]};杀死$COPROC\u PID。但我想这会很混乱。我喜欢这个,而且它肯定更好,可以解决我脑海中看到的一堆用例。但问题是,我生成的所有数字输出都会同时被输入到总和中。如果数字需要根据Sum的输出做出一些决定,我就不能。类似回声2;如果[$sum_output==2];然后回声5fi@durandaltheta:您可以使用协进程:coproc./Sum;{printf'%s'2 5;stuff;printf'%s\n'2 5;}&${COPROC[1]};杀死$COPROC\u PID。但我想这会很混乱。我实际上不知道这个问题的答案,但是第一个答案有一条评论——被接受的答案,它与你的答案非常相似,由Feuermurmel写的,说这不起作用,只是写到终端。你能澄清一下吗?我实际上不知道这个问题的答案,但是第一个答案有一条评论,这是公认的答案,它与你由Feuermurmel写的答案非常相似,他说这不起作用,只是写到终端。您能对此进行一些澄清吗?我还没有弄清楚如何从./Sum