インタプリタを模倣。

上のエントリで、

私は、結構、確認のためだけのコードを書くことが多いので、Makefile など用意せずに compile することが多いです。そのため、make コマンドだけでは物足りません。

などと書いていますが、実は、確認のためだけのコードの場合は、

#ifdef COMPILES_AND_PERFORMS_THIS_FILE
### Type "sh FILENAME"
out=`echo $0|sed 's/.[^.]*$//g'`
CC="gcc -g -Wall"
${CC:-cc} $0 -o $out && ./$out && rm -f $out
exit
#endif

#include <stdio.h>
#include <stdlib.h>

int main (int argc, char * argv[]) {
  printf ("%s executed.\n", argv[0]);
  exit (EXIT_SUCCESS);
}

の様に書いていて、

$ sh test.c
./test executed.

などとすることが多いです。昔、fj.comp.lang.c 辺りで知ったノウハウです。
プリプロセッサディレクティブの先頭文字と、sh script のコメント書式に同じ `#' が使われていることを利用したトリックですね。

あくまで、コンパイルと実行を 1アクションで行なうと言うだけの Tips で、インタプリタ並みの生産性になるとかということではありませんが。

それでも色々と工夫することはできて、例えば、

$ cat test.c
#ifdef COMPILES_AND_PERFORMS_THIS_FILE
### Type "sh FILENAME"
out=`echo $0|sed 's/.[^.]*$//g'`
debugger=$*
CC="gcc -g -Wall"
${CC:-cc} $0 -o $out && $debugger ./$out && rm -f $out
if [ -f core ]; then
	cat > .gdbinit.tmp <<EOD
echo backtrace:\n
bt
EOD
	gdb -silent -command .gdbinit.tmp ./$out -core core;
	rm .gdbinit.tmp
fi
exit
#endif

#include <stdio.h>
#include <stdlib.h>

int main (int argc, char * argv[]) {
  printf ("%s executed.\n", argv[0]);
	abort();
  exit (EXIT_SUCCESS);
}

などとしておくと、

$ sh test.c gdb -silent
Using host libthread_db library "/lib/tls/libthread_db.so.1".
(gdb) b main
Breakpoint 1 at 0x80483d4: file test.c, line 23.
(gdb) r
Starting program: /tmp/test 

Breakpoint 1, main (argc=1, argv=0xbffffb14) at test.c:23
23	  printf ("%s executed.\n", argv[0]);
(gdb) p argv[0]
$1 = 0xbffffc42 "/tmp/test"
(gdb) q
The program is running.  Exit anyway? (y or n) y

として、コンパイルした上でデバッガ配下で実行したり、

$ sh test.c
./test executed.
test.c: line 6:  6981 アボートしました        (core dumped) $debugger ./$out
Using host libthread_db library "/lib/tls/libthread_db.so.1".
Core was generated by `./test'.
Program terminated with signal 6, Aborted.

warning: current_sos: Can't read pathname for load map: 入力/出力エラーです

Reading symbols from /lib/tls/libc.so.6...done.
Loaded symbols for /lib/tls/libc.so.6
Reading symbols from /lib/ld-linux.so.2...done.
Loaded symbols for /lib/ld-linux.so.2
#0  0xb7ecc83b in raise () from /lib/tls/libc.so.6
backtrace:
#0  0xb7ecc83b in raise () from /lib/tls/libc.so.6
#1  0xb7ecdfa2 in abort () from /lib/tls/libc.so.6
#2  0x080483ee in main (argc=1, argv=0xbffffb74) at test.c:24
(gdb)

と、core を吐いたらそれを gdb に喰わせてすぐさまデバッグに入れるとか。
まあ、意味あんの? という感じではありますが、やろうと思えば色々できますというところでしょうか。