Estou tentando fazer um script bash para construir e executar um programa C++ de uma só vez com um comando, normalmente agora eu tenho que fazer
g++ file.cc -o file
./file < input.in
Eu quero ser capaz de fazer, digamos
brun file.cc < input.in
Como posso fazer isso? No momento eu tenho algo que pode ser executado como
brun file.cc '< input.in'
Aqui está meu script atual
#!/bin/bash
CFILE=$1
OBJFILE="${CFILE%.*}"
g++ $CFILE -o $OBJFILE
echo "Built file: $CFILE -> $OBJFILE"
chmod +x $OBJFILE
ARGS="${@##*.cc}"
./$OBJFILE""$ARGS
Que fica preso na última linha, mas não faz nada. Alguém pode me ajudar aqui?
Responder1
Isto deve ser suficiente:
#!/bin/bash
CFILE=$1
OBJFILE="${CFILE%.*}"
g++ $CFILE -o $OBJFILE
echo "Built file: $CFILE -> $OBJFILE"
./$OBJFILE
E você deve poder chamá-lo assim:
brun file.cc < input.in
Isso funciona porque a entrada redirecionada para STDIN do brun
script é simplesmente armazenada em buffer e essa entrada armazenada em buffer fica disponível para qualquer subprocesso que a leia primeiro - neste caso, seu executável recém-criado.
Você também pode considerar usar make
para automatizar sua construção. make
é inteligente o suficiente para fazer sua construção a partir de regras padrão sem a necessidade de um makefile explícito. Portanto, seu script de construção/execução pode ser tão simples quanto:
#!/bin/bash
OBJFILE="${1%.*}"
make "$OBJFILE" && ./$OBJFILE
O &&
aqui garante que OBJFILE só será executado se nenhum erro de compilação for encontrado pelo make
.