2013-05-12 20 views
12

Przeczytałem wiele na temat skryptów i testów programu Bash, ale nadal nie mogę wykonać tego kodu.Jak wprowadzić dane wejściowe do programu C z bash?

Zasadniczo jest to prosty program, który prosi użytkownika o jedno z następujących: northeastsouth lub west. Uruchomę program, a następnie natychmiast prosi o dane wejściowe. Po prostu nie mogę uzyskać skryptu bash, aby dać mu jakiekolwiek dane wejściowe. Próbowałem użyć echo i expect.

Każda pomoc jest doceniana.

Oto funkcja używana do pobierania wejście graczy:

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; 
} 

A oto próba skryptu bash:

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

Co próbujesz zrobić? Utwórz program C lub skrypt bash? – wallyk

+1

czy próbujesz wysłać dane wejściowe do programu 'c 'za pomocą' skryptu bash'? – abasu

+2

Naprawdę nie rozumiem, co chcesz/zapytaj, i wygląda na to, że nie jestem sam. – zmo

Odpowiedz

20

Można karmić wejście do programu z bash korzystania z tych mechanizmów:

na prosty jednej linii łańcucha, można użyć „tutaj -string ':

./ex17 <<<'w' 

dla wielu linii, można użyć «tu dokument»:

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

Albo można przenieść te z scenariusza i w osobnym pliku:

./ex17 <filename  

Ogólnie rzecz biorąc, można uruchomić polecenie, które generuje jako wyjście żądane wejście do programu i połączyć je razem z "potokiem". Na przykład, powyższe może być także napisane:

cat filename | ./ex17 

To bardziej ogólnego, ponieważ można zastąpić cat z jakiegokolwiek programu, który może zrobić wszelkiego rodzaju obliczeń, aby ustalić, co wyprowadza zamiast po prostu dumpingu zawartość plik statyczny.

Ale czego nie można łatwo zrobić z bashu to wejście napędu, odczyt wyjścia i podejmowanie decyzji o tym, co wysłać jako następne wejście. W tym celu powinieneś spojrzeć na expect. Skrypt oczekiwań może wyglądać mniej więcej tak:

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

Można to zrobić albo kod C lub Bash skrypt nie mieszany. Użyj scanf() do czytania z klawiatury (przestaje czytać po naciśnięciu klawisza ENTER) i wypełnij ten kod w języku C.

+1

próbuje wprowadzić dane wejściowe z basha do swojego programu C, co jest całkowicie możliwe –

3

Spróbuj tego: po pierwsze:

echo w | ./ex17 

Ten wyśle ​​w celu przykładu i wyjście ruchu. Nazywa się to orurowaniem; i to w zasadzie łączy stdout echa do stdin EX17

Powiązane problemy