Я пытаюсь создать bash-скрипт для сборки и запуска программы на C++ одновременно с помощью одной команды. Обычно сейчас мне приходится делать следующее:
g++ file.cc -o file
./file < input.in
Я хочу уметь делать, скажем,
brun file.cc < input.in
Как я могу это сделать? Сейчас у меня есть что-то, что можно запустить как
brun file.cc '< input.in'
Вот мой текущий сценарий
#!/bin/bash
CFILE=$1
OBJFILE="${CFILE%.*}"
g++ $CFILE -o $OBJFILE
echo "Built file: $CFILE -> $OBJFILE"
chmod +x $OBJFILE
ARGS="${@##*.cc}"
./$OBJFILE""$ARGS
Который застревает на последней строке, потом просто ничего не делает. Может ли кто-нибудь мне помочь?
решение1
Этого должно быть достаточно:
#!/bin/bash
CFILE=$1
OBJFILE="${CFILE%.*}"
g++ $CFILE -o $OBJFILE
echo "Built file: $CFILE -> $OBJFILE"
./$OBJFILE
И вы должны иметь возможность назвать это так:
brun file.cc < input.in
Это работает, поскольку входные данные, перенаправленные в STDIN скрипта, brun
просто буферизуются, и затем эти буферизованные входные данные становятся доступны любому подпроцессу, который первым их прочитает — в данном случае вашему недавно созданному исполняемому файлу.
Вы также можете рассмотреть возможность использования make
для автоматизации вашей сборки. make
достаточно умен, чтобы выполнить вашу сборку по правилам по умолчанию без необходимости явного makefile. Таким образом, ваш скрипт сборки/запуска может быть таким же простым, как:
#!/bin/bash
OBJFILE="${1%.*}"
make "$OBJFILE" && ./$OBJFILE
Здесь &&
гарантируется, что OBJFILE будет запущен только в том случае, если не было обнаружено ошибок сборки make
.