私は、1つのコマンドでC++プログラムをビルドして実行するbashスクリプトを作成しようとしています。通常、現時点では
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
。