我想(希望很容易)从 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/