最近競プロ人口がどんどん増えていますね。競プロきっかけでC++を始めたという方も多いのではないでしょうか。
今回はコマンドラインでC++のコンパイルと実行を行っている人に向けて、その2つを一気にやってしまうスクリプトを紹介します
作成したスクリプト
以下を.bashrc
または.zshrc
に追記してください。
関数名やコンパイルオプションなどは適宜変更していただければと思います。
function runcpp () {
echo -e "[\e[34mx\e[0m] g++ -std=gnu++17 -Wall -Wextra -O2 $1 -o a.out"
g++ -std=gnu++17 -Wall -Wextra -O2 $1 -o a.out
result=$?
if [ $result -ne 0 ]
then
echo -e "[\e[31m-\e[0m] compile failed"
else
echo -e "[\e[32m+\e[0m] successful complie"
echo -e "[\e[34mx\e[0m] run ./a.out"
./a.out
fi
}
実行結果
スクリプトの説明
スクリプトは次のように使います。
$ runcpp filename.cpp
中身の流れは
-
g++
を実行 - もしコンパイルに成功したら
./a.out
を実行、そうでなければ終了
というとてもシンプルなものです。しかしネット上にはコンパイル中なのかa.out
を実行中なのかよく分からないものが多く「スクリプトの実行状況をわかりやすく表示」するものが見当たらなかったため作成しました。
まず、
echo -e "[\e[34mx\e[0m] g++ -std=gnu++17 -Wall -Wextra -O2 $1 -o a.out"
g++ -std=gnu++17 -Wall -Wextra -O2 $1 -o a.out
とすることで$1
で取得した名前のcppファイルをコンパイルします。
echo
コマンドに[\e[34mx\e[0m]
とごちゃごちゃした部分がありますが、ANSIエスケープシーケンスというものを使ってターミナルでの出力に装飾をしています。この場合は[x] g++ -std=gnu++17 -Wall -Wextra -O2 $1 -o a.out
と出力し[x]
のx
は青色で表示します。
次に
result=$?
if [ $result -ne 0 ]
then
echo -e "[\e[31m-\e[0m] compile failed"
else
echo -e "[\e[32m+\e[0m] successful complie"
echo -e "[\e[34mx\e[0m] run ./a.out"
./a.out
fi
ですが、まずresult変数に$?
という値を代入しています。$?
は直前に行ったコマンドの返り値が入っています。今回「直前のコマンド」というのはg++コマンドのことですね。g++の場合コンパイルに成功していたら0
が返ってきます。
そしてresultの値が0
でないか、そうでないかで分岐しています。(-nq
はnot equal
の略ですね)
-
0
でなければ[-] complie failed
と出力して終了します。 -
0
であれば[+] successful complie
と出力して、すぐさまa.out
を実行します。
終わりに
単純なスクリプトですが便利ですのでぜひ使ってみてください!
また応用すれば他の言語のコンパイル&実行も同様に自動化できると思いますので試してみてください