gpt4 book ai didi

bash - 使用bash输入c程序的stdin

转载 作者:行者123 更新时间:2023-12-05 08:36:56 25 4
gpt4 key购买 nike

我制作了一个 c 程序,它自动接受两个标准输入,一个手动输入。

#include <stdio.h>

int main()
{
int i, j;
scanf("%d %d", &i, &j);
printf("Automatically entered %d %d\n", 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 脚本的新手,请帮忙。

最佳答案

I made a c program which takes two standard inputs automatically and one manually.

不,你没有。您编写了一个程序,试图从标准输入流中读取三个以空格分隔的十进制整数。该程序无法区分这些整数的不同来源。

The problem is EOF is passed as third input instead of asking for manual input.

不,问题在于您将程序的标准输入重定向为 shell here 文档。 here 文档提供了完整 标准输入,类似于您的程序正在读取包含 here 文档内容的文件。当它到达终点时,它不会退回到阅读任何其他内容。

I cannot change my c program and I cannot input third input before the two inputs

我认为这两个陈述是多余的:您不能更改程序,以便您描述为“手动”的输入是它尝试读取的第一个输入。无论如何,这并不会有帮助。

您需要做的是将固定输入添加到测试程序的标准输入流中的终端输入。有很多方法可以做到这一点,但是 cat命令(连接catenate 的助记符)似乎是一个自然的选择。这将与流程替换一起工作以实现您的目标。例如,

#!/bin/bash

cat <(echo 1 2) - | ./test

<(echo 1 2)部分执行 echo 1 2并提供其标准输出,就好像它是一个文件一样。 cat命令将其与自己的标准输入(由 - 表示)连接起来,将其结果发送到标准输出。结果通过管道传输到程序 ./test .

这提供了一种方法,可以将您控制下的固定输入添加到从标准输入读取的任意数据之前。也就是说,包装器脚本不需要知道程序在固定初始部分之后期望的输入。

关于bash - 使用bash输入c程序的stdin,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67178482/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com