我发现了如何使用 Shell 脚本自动将输入发送到 C 程序。例如,如果我编译这个 C 程序:
//test.c
int main()
}
int x;
printf("Please enter an integer:");
scanf("%d", &x);
printf("\nYou entered %d\n", x);
}
并编写这个脚本:
#!/bin/bash
./test << EOF
5
EOF
并打开终端并运行脚本我将得到以下输出:
Please enter an integer:
You entered 5
现在,我想在新终端上运行测试,我发现可以使用此命令来执行此操作:
gnome-terminal -x ./test
问题是,如果我尝试在脚本中同时执行这两项操作(在新终端上运行测试并自动发送输入),它不起作用,输入不会在新终端上发送,您只需像平常一样自己提供。
我做错了什么以及如何解决这个问题?
PS 抱歉,如果格式有点混乱,我尝试过。
答案1
如果您使用 shell 脚本而不是二进制文件,它将起作用。
$ ~/tmp/term_test$ cat ./test_wrapper.sh
#!/bin/bash
./test << EOF
5
EOF
read dummy
$ gnome-terminal -x ./test_wrapper.sh
$
我添加的“read dummy”行将阻止终端在脚本完成时立即关闭。
您确定需要打开一个新的终端会话吗?
答案2
我想我已经找到了一种方法来实现你想要的,但我想你会想了解重定向以避免相当混乱的输出。
我使用作业控制(& - 在后台运行)能够同时运行 2 个实例。有关更多详细信息,请参阅 bash 手册页。您还可以在那里找到有关重定向的报道。
我为你的 C 示例添加了一个睡眠,这样它就不会立即终止。 michael@bunchan:~/tmp/term_test$ 回声 5 | ./test 请输入一个整数:您输入了 5 michael@bunchan:~/tmp/term_test$ echo 99999 | ./test 请输入一个整数:您输入了 99999 michael@bunchan:~/tmp/term_test$
michael@bunchan:~/tmp/term_test$
$ cat test.c
//test.c
#include <stdio.h>
#include <unistd.h>
int main()
{
int x;
sleep(10);
printf("Please enter an integer:");
scanf("%d", &x); printf("\nYou entered %d\n", x);
}
$ ./test & << EOF
> 999
> EOF
[1] 10638
$ ./test & << EOF
5
EOF
[2] 10639
$ jobsPlease enter an integer:
[1]+ Stopped ./test
[2]- Running ./test &
$ Please enter an integer:jobs
[1]- Stopped ./test
[2]+ Stopped ./test
$
答案3
这是对您原来问题的更好答案,使用管道而不是重定向。
$ echo 5 | ./test
Please enter an integer:
You entered 5
$ echo 99999 | ./test
Please enter an integer:
You entered 99999
$