Создание bash-скрипта для сборки и запуска программы на C++

Создание bash-скрипта для сборки и запуска программы на C++

Я пытаюсь создать 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.

Связанный контент