Как я могу предоставить ввод для программы на C из bash?

Я читал тонну о скриптах bash и тестировании программ, но я все еще не могу заставить этот код работать.

В принципе, это простая программа, которая запрашивает пользователя для любого из north east south или west. Я запускаю программу, затем сразу же запрашивает ввод. Я просто не могу получить bash script, чтобы дать ему какой-либо ввод. Я попытался использовать echo и expect.

Любая помощь приветствуется.

Вот функция, используемая для ввода игроков:

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 script:

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

Ответ 1

Вы можете передать ввод в программу из bash, используя любой из следующих механизмов.

Для одной строки ввода вы можете использовать здесь-строку:

./ex17 <<<'w'

Для нескольких строк вы можете использовать "здесь-документ":

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

Или вы можете переместить эти строки из скрипта в отдельный файл:

./ex17 <filename    

В более общем смысле вы можете запустить команду, которая в качестве своего вывода генерирует желаемый вход для вашей программы, и соединить их вместе с помощью "канала". Например, вышесказанное также может быть написано:

cat filename | ./ex17

или оригинальный пример как

echo w | ./ex17

Это более общее, потому что вы можете заменить cat и echo здесь любой программой, которая может выполнять все виды вычислений, чтобы определить, что он выводит, вместо того, чтобы просто выгружать содержимое статического файла.

Но то, что вы не можете легко сделать из 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

Ответ 2

Попробуйте следующее: сначала:

 echo w | ./ex17 

Это отправит w в пример и выведет ход. Это называется трубопроводом; и он, по существу, соединяет stdout эха с stdin ex17

Ответ 3

Вы можете сделать либо код C, либо Bash script, а не смешанный. Используйте scanf() для чтения с клавиатуры (он перестает читать, когда вы нажмете ENTER) и заполните этот код на языке C.