PythonやRubyなんかはShebangをファイルの先頭に書いておくと、 ファイルの実行権限を持っていれば内容をその言語のものとして読み取って実行してくれます。
これと同じような事をしてくれるコマンドが cです。
c
c
はファイルの中身を見ると結構単純なシェルスクリプトです。
中でcc
を使ってコンパイルして実行する、を一気にやってくれるわけです。
その際、実際の実行ファイルなんかは 一時ディレクトリ($C_CACHE_PATH or $TMPDIR or /tmp) に作られるのでまるでスクリプトを実行してる様な感じで コマンドが実行されます。
使うには上のレポジトリからc
スクリプトを取ってきて適当なPATH
の通った
ディレクトリにインストールします。
Shebangを使って実行
後はShebangを使ってスクリプトっぽく書きたい場合には
1 2 3 4 5 6 7 |
|
こんな感じでShebangに
#!/usr/bin/env c
を書いて(env
使わずにc
への直パスでも良いですが)、
その後に普通のCのコードを書いていくだけです。
このファイルを実行可能にして実行してみると
$ chmod 755 hello.c
$ ./hello.c
Hello World!
こんな感じでスクリプト感覚で実行できます。 勿論、ちょっと書き換えて実行することも可能。
C++を使いたいときは、ファイルの拡張子をcc
、c++
、cpp
、cxx
の
いずれかにします。
1 2 3 4 5 6 7 8 |
|
こんなのを作ると
$ chmod 755 hello.cxx
$ ./hello.cxx
Hello World!
また引数を取ることも出来、
1 2 3 4 5 6 7 8 9 |
|
こんなファイルを作れば
$ ./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