LoginSignup
3
2

More than 3 years have passed since last update.

C++のコンパイルから実行までを自動で行うシェルスクリプトを作った

Last updated at Posted at 2020-04-23

最近競プロ人口がどんどん増えていますね。競プロきっかけでC++を始めたという方も多いのではないでしょうか。

今回はコマンドラインでC++のコンパイルと実行を行っている人に向けて、その2つを一気にやってしまうスクリプトを紹介します

作成したスクリプト

以下を.bashrcまたは.zshrcに追記してください。

関数名やコンパイルオプションなどは適宜変更していただければと思います。

.bashrc
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
}

実行結果

image.png

スクリプトの説明

スクリプトは次のように使います。

$ runcpp filename.cpp

中身の流れは

  1. g++を実行
  2. もしコンパイルに成功したら./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でないか、そうでないかで分岐しています。(-nqnot equalの略ですね)

  • 0でなければ[-] complie failedと出力して終了します。
  • 0であれば[+] successful complieと出力して、すぐさまa.outを実行します。

終わりに

単純なスクリプトですが便利ですのでぜひ使ってみてください!
また応用すれば他の言語のコンパイル&実行も同様に自動化できると思いますので試してみてください

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2