rcmdnk's blog

プログラムはなぜ動くのか 第2版  知っておきたいプログラムの基礎知識

PythonやRubyなんかはShebangをファイルの先頭に書いておくと、 ファイルの実行権限を持っていれば内容をその言語のものとして読み取って実行してくれます。

これと同じような事をしてくれるコマンドが cです。

c

cはファイルの中身を見ると結構単純なシェルスクリプトです。 中でccを使ってコンパイルして実行する、を一気にやってくれるわけです。

その際、実際の実行ファイルなんかは 一時ディレクトリ($C_CACHE_PATH or $TMPDIR or /tmp) に作られるのでまるでスクリプトを実行してる様な感じで コマンドが実行されます。

使うには上のレポジトリからcスクリプトを取ってきて適当なPATHの通った ディレクトリにインストールします。

Shebangを使って実行

後はShebangを使ってスクリプトっぽく書きたい場合には

hello.c
1
2
3
4
5
6
7
#!/usr/bin/env c
#include <stdio.h>

int main(void) {
    printf("Hello World!\n");
    return 0;
}

こんな感じでShebangに

#!/usr/bin/env c

を書いて(env使わずにcへの直パスでも良いですが)、 その後に普通のCのコードを書いていくだけです。

このファイルを実行可能にして実行してみると

$ chmod 755 hello.c
$ ./hello.c
Hello World!

こんな感じでスクリプト感覚で実行できます。 勿論、ちょっと書き換えて実行することも可能。

C++を使いたいときは、ファイルの拡張子をccc++cppcxxの いずれかにします。

hello.cxx
1
2
3
4
5
6
7
8
#!/usr/bin/env c
#include <iostream>
using namespace std;

int main(void) {
    cout << "Hello World!" << endl;
    return 0;
}

こんなのを作ると

$ chmod 755 hello.cxx
$ ./hello.cxx
Hello World!

また引数を取ることも出来、

argtest.c
1
2
3
4
5
6
7
8
9
#!/usr/bin/env c
#include <stdio.h>

int main(int argc, char *argv[]){
    int i;
    for (i = 0; i < argc; i++) printf("argv[%d] = %s\n", i, argv[i]);

    return 0;
}

こんなファイルを作れば

$ ./argtest.c arg1 arg2
argv[0] = ./argtest.c
argv[1] = arg1
argv[2] = arg2

こんな風に引数が与えられます。

コマンドとしてファイルを引数として渡して実行

Pythonとか他の言語の様にファイルを引数として渡して実行することも出来ます。 この場合はShebangの部分はあっても無くても良いので 通常のC/CXXのファイルを実行することも出来ます(ただしmain関数を含む、 実行に必要な全ファイルが必要)。

$ c hello.c
Hello World!
$ c hello.cxx
Hello World!
$ c argtest.c arg1 arg2
argv[0] = ./argtest.c
argv[1] = arg1
argv[2] = arg2

標準入力から受け取ることも可能:

$ cat hello.c| c
Hello World!

ただし、標準入力から与える場合にはファイルの判定のしようが無いので C++的な物は使えません。 また、引数を与えるのもこちらだとちょっと無理です。 (この辺はちょっとオプション加えたり工夫するだけでなんとかなりそう。)

その他出来るコト

  • cコマンドに複数ファイルをまとめて渡すことも可能。
  • オプションも渡せる。

例:

  $ c "main.c other.c -O3 -Wall -lncurses" arg1 arg2
Sponsored Links
Sponsored Links

« Travis CIでTagsに対するpushを無視する 'このYahoo! JAPAN IDはオークションの利用を停止されています。'への対処法 »

}