何となく作ってみた。Cでワンライナー(1liner)っぽいものが書けます。
OSのテストなどでシステムコールを直接呼びたいときなんかは便利かと。perlでsysopenとかやるよりも直接的。
使用方法
ce [-m] [-I sysheader] [-i header] [C-code] [args ...]
- -m : int main(int argc, char**argv) { 〜 ; return 0; } で囲む。
- -I header : #include
を挿入 - -i header : #include "header" を挿入
- -v : ソースファイルと実行コマンドを表示
% ce 'main(){puts("Hello,World!");}' Hello,World! % ce -m 'puts("Hello,World!")' # 上と同じ Hello,World! % ce -I stdio.h -m 'printf("%d\n", argc)' arg1 arg2 # ヘッダや引数の指定 3
C-codeを省略または "" にすると、標準入力から読み込みます。
コンパイルオプションはCFLAGS, LDFLAGS環境変数で。コンパイラはgcc固定です。
以下ceコマンドのソース(シェルスクリプト)。
#!/bin/bash TMP_C=/tmp/ce.$$.c TMP_O=/tmp/ce.$$.out echo -n > $TMP_C ADD_MAIN=0 VERBOSE=0 while getopts I:i:mv OPT; do case $OPT in "I") echo '#include <'$OPTARG'>' >> $TMP_C;; "i") echo '#include "'$OPTARG'"' >> $TMP_C;; "m") ADD_MAIN=1;; "v") VERBOSE=1;; esac done shift `expr $OPTIND - 1` [ $ADD_MAIN = 1 ] && echo 'int main(int argc, char**argv) {' >> $TMP_C if [ "$1" != "" ]; then echo "$1" >> $TMP_C else echo reading source from stdin ... cat >> $TMP_C fi [ $ADD_MAIN = 1 ] && echo '; return 0; }' >> $TMP_C [ $VERBOSE = 1 ] && cat $TMP_C shift 1; [ $VERBOSE = 1 ] && echo gcc $CFLAGS $LDFLAGS $TMP_C -o $TMP_O \&\& $TMP_O $* gcc $CFLAGS $LDFLAGS $TMP_C -o $TMP_O && $TMP_O $* rm -f $TMP_O $TMP_C