¿Cómo proporciono entrada a un programa C desde bash? [duplicate]

3 minutos de lectura

avatar de usuario
pared en blanco

He estado leyendo mucho sobre bash scripts y pruebas de programas, pero todavía no puedo hacer que este código funcione.

Básicamente es un programa simple que pregunta al usuario por cualquiera de north east south o west. Comienzo el programa e inmediatamente me pide una entrada. Simplemente no puedo obtener el script bash para darle ninguna entrada. Traté de usar echo y expect.

Cualquier ayuda es apreciada.

Aquí está la función utilizada para obtener la entrada de los jugadores:

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

Y aquí está el intento de un script bash:

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

  • ¿Qué es lo que estás tratando de hacer? ¿Crear un programa en C o un script bash?

    – Wallyk

    12 mayo 2013 a las 15:20

  • ¿Estás tratando de enviar la entrada al c program a través de un bash script?

    – abasu

    12 mayo 2013 a las 15:21

  • Realmente no entiendo lo que quieres/pides, y parece que no estoy solo.

    – zmo

    12 mayo 2013 a las 15:22

  • Sí, estoy tratando de enviar información a este programa con un script bash.

    – pared en blanco

    12 mayo 2013 a las 15:29

  • @blankwall muestra lo que has hecho en el script bash? es bastante fácil alimentarlo con líneas en bash TAMBIÉN muestre su main() en C

    – Ahmed Masud

    12 mayo 2013 a las 15:33


avatar de usuario
marca caña

Puede alimentar la entrada a un programa desde bash usando cualquiera de los siguientes mecanismos.

Para una sola línea de entrada, puede usar un aquí-cadena:

./ex17 <<<'w'

Para varias líneas, puede utilizar un aquí-documento:

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

O puede mover esas líneas fuera de la secuencia de comandos y en un archivo separado:

./ex17 <filename    

En términos más generales, puede ejecutar un comando que genera como salida la entrada deseada para su programa y conectarlos con un tubo. Por ejemplo, lo anterior también podría escribirse:

cat filename | ./ex17

o el ejemplo original como

echo w | ./ex17

Eso es más general porque puedes reemplazar cat y echo aquí con cualquier tipo de programa, que puede hacer todo tipo de cálculos para determinar lo que genera en lugar de simplemente volcar el contenido de una cadena o archivo estático.

Pero lo que no puede hacer fácilmente desde bash es controlar la entrada, leer la salida y tomar decisiones sobre qué enviar como la siguiente entrada. Para eso, debes mirar suponer. Un script esperado se vería así:

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

Prueba esto: primero:

 echo w | ./ex17 

Esto enviará w al ejemplo y generará el movimiento. Esto se llama tubería; y esencialmente conecta el stdout de echo al stdin de ex17

avatar de usuario
Arrigo Pierotti

Puedes hacer un C código o un Bash guión, no uno mixto. Utilizar scanf() para leer desde el teclado (deja de leer cuando presiona ENTER) y complete este código en C idioma.

  • él está tratando de alimentar la entrada de bash en su programa C, lo cual es perfectamente posible

    – Ahmed Masud

    12 mayo 2013 a las 15:40

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad