如何为接受多次输入的C程序编写Bash脚本?

如何为接受多次输入的C程序编写Bash脚本?,c,bash,unix,C,Bash,Unix,所以我有一个C程序,它接受一个命令行参数,并用它做一些事情。过了一会儿,它会再次提示用户输入一些标准输入 例如,典型用法可能如下所示: ./prac1 4 4 Enter something else: _hello_ hello 我的问题是,如何编写一个能够重新输入更多输入(通过stdin)的bash脚本,以便在程序输出后响应程序的重新提示 输入其他内容: ? 到目前为止,我已经做到了: cc=gcc EXEC=prac1 SRC=prac1.c input="4" printValue=

所以我有一个C程序,它接受一个命令行参数,并用它做一些事情。过了一会儿,它会再次提示用户输入一些标准输入

例如,典型用法可能如下所示:

./prac1 4
4
Enter something else: _hello_
hello
我的问题是,如何编写一个能够重新输入更多输入(通过stdin)的bash脚本,以便在程序输出后响应程序的重新提示 输入其他内容: ?

到目前为止,我已经做到了:

cc=gcc
EXEC=prac1
SRC=prac1.c
input="4"

printValue=`./$EXEC $input`
if [ "$?" == '1' ];
then
    echo "Error"
    exit
fi
echo "printValue = $printValue"
prac1以上是指以下代码:

int main(int argc, char** argv) {
    char* input[70];
    printf("%c\n", argv[1][0];
    fflush(stdin);
    printf("Enter something else: ");
    fscanf(stdin, "%s", input);
    printf("%s\n", input);
}
bash脚本使用命令行arg“4”调用可执行文件prac1。当我运行这个脚本时,在它使用
printValue=`./$EXEC$input`
执行后,我必须在“输入其他内容:”提示后手动键入内容。这是意料之中的

然而,我正试图弄明白如何让bash自动输入某些内容。我的意思是,我不必亲自手动输入


非常感谢您。

您真正想要什么还不清楚,您没有解释脚本的目的(因此您的问题听起来像是一些问题)以及您的
prac1
程序正在做什么和应该做什么

因此,请阅读。也许您想使用
读取
。您还可以决定通过或
getopts
或重定向来为脚本提供一些数据

可能
bash
不是适合您的工具。可能你需要一些工具(比如或)。如果您的实际目的是在编辑某个文件后重新生成某些代码,那么这是更好的方法

研究几个小项目(例如,在Linux发行版上,或从Linux发行版上),研究它们的源代码以获得灵感

也许将更多的功能转移到
prac1.c
中是实现(未说明的)目标的最简单方法。
prac1
可能接受多个程序参数。阅读文档的一章

如果您想要编写一个与正在运行的进程交互的脚本,那么它是复杂的。你可以考虑。

为了完整性,我会提到,但我建议不要在您的案例中使用它(改进
prac1
会更简单)。请注意,
expect
在终端级别工作,而Unix、
tty
s和
pty
s很难理解(read、about和)。如果您真的想对终端IO进行编码,请考虑使用类似或类似./P>的库。 您还可以通过阅读类似(或更新的)一本书来了解更多关于Linux编程的知识,并参考可用的。请特别注意,在输入和输出上使用例如多路复用的能力

如何编写能够重新输入更多输入的bash脚本

你应该避免那种情况。如果你真的需要一个脚本来驱动其他程序并使脚本和程序同时运行,那么你应该考虑其他一些方法(包括用其他脚本语言编写脚本,例如Python,AWK,…)。 shell脚本的传统用法是驱动低级程序,而不是与它们交互共存(即使使用诸如协进程之类的技巧也可以做到这一点;在30多年的编程过程中,我从未使用过)

当一个特性很难用shell脚本实现时,您的系统应该以不同的方式组织shell并不是所有问题的答案(有时使用与任务更相关的其他工具,甚至开发驱动其他进程的C程序更简单)。根据经验,我避免使用太复杂的shell脚本。我可能有一些很长(但概念上很简单,因为是连续的)shell脚本。我也有一些程序(例如在
awk
m4
、C或Python中)生成(长)shell脚本(很久以来就这样做了)。但我避免手动编写然后维护复杂的shell脚本(并将它们视为错误设计的症状)

为了说明我上面的观点:
make
ninja
(以及其他构建自动化工具)都在驱动其他程序。原则上,你可以通过编写一个巨大的shell脚本来实现他们的目标。但事实上,没有人这样做(理由很充分:shell在实践中不是通用工具)。因此,教训是:不要尝试使用
bash
它本来不打算轻松完成的事情(在我看来,这意味着:当您的shell脚本变得太复杂时,将其丢弃,然后使用或编写其他东西)

还可以阅读有关的文章。您的脚本和C程序的组合与Unix的理念格格不入。也许您应该有一个单独的程序(可能是用C编写的,但比您展示给我们的
prac1.C
复杂得多),或者您希望围绕某个运行
prac1
的命令执行一个简单的shell循环

shell是一种方便的工具(在简单脚本中使用时),但它是一种糟糕的编程语言(并且很难进行静态分析或推理;例如,查看研究项目,请参阅Yann Regis Gianas FOSDEM2018 talk on)对于足够复杂的任务,您不想使用,您确实想使用更好的工具,当shell脚本变得不可读或无法维护时,您应该扔掉它


你的问题隐含了这样一个假设:
bash
适用于大多数任务。但事实并非如此;在Linux上,您还有许多其他脚本语言,例如,,,,,,,,其中许多语言比
bash
更适合,至少在某些领域是这样。您最好选择适合您的目标的工具。

您可以在输入时一次通过标准输入传递所有输入字符串
printValue=$(./prac1 "$input"<<\____
first answer
Here's my answer to the second prompt.
If the script reads multiple lines of input
until EOF at any point, that of course will
consume all of the remaining here document.
____
)
printValue=$(./prac1 "$input" <<<"something else")
printValue=$(echo "something else" | ./prac1 "$input")