linux - 如何将 bash 输出写入任意程序标准输入

标签 linux bash shell io

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

假设我有一些任意程序“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了解更多信息

最佳答案

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

{
    echo 2
    echo 5
} | ./Sum

numbers() {
    echo 2
    echo 5
}

numbers | ./Sum

这让您可以随心所欲地生成输入。你不必提前拥有这一切。如果您一点一点地生成输入,它将一点一点地馈送到 ./Sum

关于linux - 如何将 bash 输出写入任意程序标准输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39754214/

相关文章:

linux - 仅适用于一个进程的挂载点/符号链接(symbolic link)

linux - Windows 10 更新后无法访问 virtualbox 中的网站

linux - 在伪 tty 上运行 slattach

具有文件保存和顺序文件命名的 Linux shell 脚本

从 C 源代码调用汇编例程

xml - 验证xml文件+如何将xmllint命令设置为静默模式

c - C语言中如何同时运行2个进程?

linux - 将变量值注入(inject)占位符配置中

shell - Unix shell bash 'one-liner' 隔离包含包含 ".mp3"的 URL 的所有括号

linux - 在 shell 脚本中复制一个变量 (Linux)