bashのfunction版 rungcc
bashのfunction版 rungccを作ってみた。
オリジナルと比較し ファイルの先頭の#!/home/usr/bin/rungcc ができないだけ。(ここもbash -cオプション等がもう少し研究できれば先にいけそうな気配がある。)
以下を.bashrcに書き込む
function rungcc(){ e=/tmp/___$$;t=$e.c;p="echo -n";echo "#include <stdio.h>">$t;if [ $# = 2 ];then if [ $1 == -e ];then $p "$2">>$t;else $p "int main(){">>$t;a='printf("%';b="\\n\",$2)";case $1 in -m)$p "$2";;-d)$p "${a}d$b";;-f)$p "${a}f$b";;esac>>$t;$p ";}">>$t;fi;else read -rd '' s;$p "$s">>$t;fi;gcc $t -o $e;[ -e $e ]&&($e;rm $e);rm $t; }
使い方はオリジナルに準拠
$ rungcc -e 'int main(){printf("全文を書く場合\n");}' ; # include文は不要 全文を書く場合 $ rungcc -m 'printf("メインの省略\n")' ; # main文も不要 メインの省略 $ rungcc -d '1+1' ; #整数の演算を表示 2 $ rungcc -f '1.0/3.0' ; #浮動小数の演算を表示 0.333333 $ echo 'int main(){printf("標準入力から\n");}'|rungcc ; #標準入力からソースを受け取る 標準入力から
展開したソース
functionにするために圧縮かけたので理解のための展開したソースもはっておく。
#!/bin/bash e=/tmp/___$$ # 実行ファイル t=$e.c # ソースファイル p="echo -n" # コマンド圧縮用 echo "#include <stdio.h>">$t if [ $# = 2 ];then # 引数がある場合 if [ $1 == -e ] then $p "$2">>$t else $p "int main(){">>$t a='printf("%' b="\\n\",$2)" case $1 in -m)$p "$2";; -d)$p "${a}d$b";; -f)$p "${a}f$b";; esac>>$t $p ";}">>$t fi else # 標準入力の場合 read -rd '' s; $p "$s">>$t fi cat $t;echo;echo # デバッグ用 gcc $t -o $e [ -e $e ]&&($e;rm $e) rm $t
これをrungcc.shとして保存すると以下のような実行結果になる
$ ./rungcc.sh -e 'int main(){printf("hello,world\n");}' #include <stdio.h> int main(){printf("hello,world\n");} hello,world $ ./rungcc.sh -m 'printf("hello,world\n")' #include <stdio.h> int main(){printf("hello,world\n");} hello,world $ ./rungcc.sh -d '1+1' #include <stdio.h> int main(){printf("%d\n",1+1);} 2 $ ./rungcc.sh -f '1.0/3.0' #include <stdio.h> int main(){printf("%f\n",1.0/3.0);} 0.333333 $ echo 'int main(){printf("hello,world\n");}'|./rungcc.sh #include <stdio.h> int main(){printf("hello,world\n");} hello,world