Как я могу предоставить ввод для программы на 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
.