Estoy intentando crear un script bash para compilar y ejecutar un programa C++ a la vez con un comando, normalmente ahora tengo que hacer
g++ file.cc -o file
./file < input.in
Quiero poder hacer, decir
brun file.cc < input.in
¿Cómo puedo hacer esto? Ahora mismo tengo algo que se puede ejecutar como
brun file.cc '< input.in'
Aquí está mi guión actual.
#!/bin/bash
CFILE=$1
OBJFILE="${CFILE%.*}"
g++ $CFILE -o $OBJFILE
echo "Built file: $CFILE -> $OBJFILE"
chmod +x $OBJFILE
ARGS="${@##*.cc}"
./$OBJFILE""$ARGS
Que se atasca en la última línea y luego no hace nada. ¿Puede alguien ayudarme aquí?
Respuesta1
Esto debería ser suficiente:
#!/bin/bash
CFILE=$1
OBJFILE="${CFILE%.*}"
g++ $CFILE -o $OBJFILE
echo "Built file: $CFILE -> $OBJFILE"
./$OBJFILE
Y deberías poder llamarlo así:
brun file.cc < input.in
Esto funciona porque la entrada redirigida a STDIN del brun
script simplemente se almacena en el búfer, y esa entrada almacenada en el búfer está disponible para cualquier subproceso que la lea primero; en este caso, el ejecutable recién creado.
También podrías considerar usarlo make
para automatizar tu compilación. make
es lo suficientemente inteligente como para realizar su compilación a partir de reglas predeterminadas sin la necesidad de un archivo MAKE explícito. Entonces su script de compilación/ejecución podría ser tan simple como:
#!/bin/bash
OBJFILE="${1%.*}"
make "$OBJFILE" && ./$OBJFILE
Aquí &&
se garantiza que OBJFILE solo se ejecute si no se encontraron errores de compilación make
.