c - 如何从 bash 向 C 程序提供输入?

标签 c bash

<分区>

我已经阅读了大量有关 bash 脚本和程序测试的资料,但我仍然无法使这段代码正常工作。

基本上它是一个简单的程序,要求用户选择north east southwest。我启动程序,然后它立即要求输入。我只是无法让 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'

对于多行,您可以使用此处文档:

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

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

./ex17 <filename    

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

cat filename | ./ex17

或原始示例为

echo w | ./ex17

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

但是您无法通过 bash 轻松完成的是驱动输入、读取输出以及决定将什么作为下一个输入发送。为此,您应该查看 expect . expect 脚本看起来像这样:

#!/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

关于c - 如何从 bash 向 C 程序提供输入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52522969/

相关文章:

c - 如何为 GnuTLS 生成 PSK key

c - C语言中如果改变指针会释放多少内存?

regex - 将文件夹中的所有图像移动到子文件夹,并将文本文件中对这些图像的所有引用更新到它们的新位置?

bash - Bash 中的条件流水线

我可以比较 float 并将其与 C 中的整数相加吗?

c - 写(): Bad file descriptor

c - 使用 fork() 获取 child 的 child

linux - 对带有日期的变量进行操作会产生错误

perl - 零垫重命名,例如图片 (2).jpg -> 图片 (002).jpg

bash - 如何将subshel​​l结果(数组)传递给SSH命令?