如何从bash为C程序提供输入?

我一直在读大量关于bash脚本和程序测试但我仍然无法使这段代码工作。

基本上它是一个简单的程序,要求用户向eastwest 。 我启动程序然后它立即要求输入。 我只是不能让bash脚本给它任何输入。 我尝试使用echoexpect

任何帮助表示赞赏。

以下是用于获取玩家输入的函数:

 int process_input(Map *game) { printf("\n> "); char ch = getchar(); char a = getchar(); //eat enter int damage = rand() % 4; switch(ch) { case -1: printf("you suck\n"); return 0; break; case 'n': game->proto.move(game, NORTH); break; case 's': game->_(move)(game, SOUTH); break; case 'e': game->_(move)(game, EAST); break; case 'w': game->_(move)(game, WEST); break; case 'a': game->_(attack)(game, damage); break; case 'l': printf("You can go:\n"); if(game->location->north) printf("NORTH\n"); if(game->location->south) printf("SOUTH\n"); if(game->location->east) printf("EAST\n"); if(game->location->west) printf("WEST\n"); break; default: printf("Whats next?", ch); } return 1; } 

以下是bash脚本的尝试:

  #!/bin/bash /Desktop/c ./ex17 echo 'w' 

您可以使用以下任何机制从bash向程序提供输入。

对于单行输入,您可以使用’here-string’:

 ./ex17 <<<'w' 

对于多行,您可以使用“here-document”:

 ./ex17 <<'EOF' w second line of input more input EOF 

或者您可以将这些行移出脚本并放入单独的文件中:

 ./ex17  

更一般地说,您可以运行一个命令,为您的程序生成所需的输入,并使用“管道”将它们连接在一起。 例如,上面也可以写成:

 cat filename | ./ex17 

这更通用,因为你可以用任何类型的程序替换cat ,它可以进行各种计算以确定它输出的内容而不仅仅是转储静态文件的内容。

但是,你不能轻易从bash做的是驱动输入,读取输出,并决定将什么作为下一个输入发送。 为此,你应该看看期望 。 期望脚本看起来像这样:

 #!/usr/bin/env expect spawn ./ex17 expect ">" send "w\n" expect "Whats next?" send "next line here\n" # turn it back over to interactive user interact 

试试这个:第一个:

  echo w | ./ex17 

这将向示例发送w并输出移动。 这叫做管道; 它基本上将echo的stdout连接到ex17的stdin

您可以使用C代码或Bash脚本,而不是混合脚本。 使用scanf()从键盘读取(当你按Enter键时它会停止读取)并用C语言完成这段代码。