使用bash输入c程序的stdin
我制作了一个自动接受两个标准输入和一个手动输入的 ac 程序。
#include <stdio.h>
int main()
{
int i, j;
scanf("%d %d", &i, &j);
printf("Automatically entered %d %dn", i, j);
int k;
scanf("%d", &k);
printf("Manually entered %d", k);
return 0;
}
我想使用 bash 脚本运行这个程序,它可以自动输入前两个输入,留下一个需要手动输入的输入。这是我正在使用的脚本。
#!/bin/bash
./test <<EOF
1
2
EOF
问题是 EOF 作为第三个输入传递而不是要求手动输入。我无法更改我的 c 程序,也无法在两个输入之前输入第三个输入,所以我如何使用 bash 执行此操作。我是 bash 脚本的新手,请帮忙。
回答
我制作了一个自动接受两个标准输入和一个手动输入的 ac 程序。
不,你没有。您编写了一个程序,试图从标准输入流中读取三个以空格分隔的十进制整数。该程序无法区分这些整数的不同来源。
问题是 EOF 作为第三个输入传递而不是要求手动输入。
不,问题在于您将程序的标准输入重定向为 shell here 文档。here 文档提供了整个标准输入,类似于您的程序正在读取具有 here 文档内容的文件。当它到达终点时,它不会退回到阅读其他任何东西。
我无法更改我的 c 程序,也无法在两个输入之前输入第三个输入
我认为这两个语句是多余的:您不能更改程序,以便您描述为“手动”的输入是它尝试读取的第一个。无论如何,这不会有帮助。
您需要做的是在测试程序的标准输入流中将固定输入添加到终端输入中。有很多方法可以做到这一点,但cat命令(con cat enate 的助记符)似乎是一个自然的选择。这将与流程替代一起工作以实现您的目标。例如,
#!/bin/bash
cat <(echo 1 2) - | ./test
该<(echo 1 2)部件执行echo 1 2并提供其标准输出,就好像它是一个文件一样。该cat命令将其与自己的标准输入(由 表示-)连接,将其结果发送到其标准输出。结果通过管道传输到 program ./test。
这提供了一种将受您控制的固定输入添加到从标准输入读取的任意数据的方法。也就是说,包装器脚本不需要知道在固定的初始部分之后程序期望什么输入。