我有一个交互式C程序,我想使用.sh脚本进行测试。 我根据这些方向创建了一个:https://unix.stackexchange.com/questions/21759/how-to-send-input-to-a-c-program-using-a-shell-script,它工作正常,但屏幕上的输出不好。 我希望输入显示在屏幕上并在输入后显示新行,就像用户手动输入所有内容一样。它现在显示的方式是提示,然后是空格,然后是下一个提示,依此类推。
我看过许多不同的问题,但没有人提供答案。 我可以每次从程序本身打印输入,但这意味着即使用户手动输入数据也会打印输入。
我确实理解它是因为输入来自文件而不是命令行,但我仍然想要解决这个问题。 无论如何我能做到吗?我不能使用任何外部工具,因为我必须为一个类提交此脚本。
答案 0 :(得分:1)
如果您可以使用bash,并且 - 例如 - 您的程序为每个行输入输出一行,那么您需要从shell脚本执行的操作是:
这是一个示例C程序,它只是回显任何键入的行,前缀为“你输入”:
#include <stdio.h>
int main(void){
char buffer[1024];
while ( fgets(buffer, 1024, stdin) ) {
printf("You entered: %s", buffer);
}
return 0;
}
如果我们从终端运行,我们得到这个:
paul@thoth:~/src/sandbox$ ./sample
first line
You entered: first line
second line
You entered: second line
third line
You entered: third line
paul@thoth:~/src/sandbox$
(使用 CTRL-D 在输入第三行后终止输入。)
这是一个模拟它的bash脚本:
#!/bin/bash
# Pass input to program and store output
input=$'first line\nsecond line\nthird line'
output=`echo "$input" | ./sample`
# Split input and output lines to arrays
IFS=$'\n'
inlines=($input)
outlines=($output)
# Alternately print input and outline lines
for i in "${!inlines[@]}"; do
echo "${inlines[$i]}"
echo "${outlines[$i]}"
done
给出输出:
paul@thoth:~/src/sandbox$ ./test_sample.sh
first line
You entered: first line
second line
You entered: second line
third line
You entered: third line
paul@thoth:~/src/sandbox$
与在交互式会话中的外观相同。
如果您的程序没有使用像这样的简单的逐行调用和响应,那么您将需要做更多的工作,但如果您拥有所有的输入和输出行,并且您知道期待什么,然后它是可行的,因为在程序完成后你仍然可以访问你的所有输入和所有输出,你可以回应它们,但是你需要。