ファイル名の代わりに - を使う,だけではうまくいかなくて,一緒に -xc をつけるのがミソ.知らずに -xc をつけずに実行すると
gcc: -E required when input is from standard input
なんていう不親切なエラーメッセージが出て来て,正解にはたどり着けない.ひどい.
どうしてこんなことを調べたのかというと,この間書いた tcc [2006-06-08-3] みたいなことを普通の gcc でやってみたくなったのだった.
とりあえずこんな感じで.
/usr/local/bin/gccx:
#!/bin/sh tmpf=/tmp/gccx.$$ cleantmp () { /bin/rm -f $tmpf exit } trap cleantmp INT QUIT TERM PIPE HUP script=$1 shift sed 's/^#!.*$//' $script | gcc -xc -o $tmpf - && $tmpf "$@" cleantmp
テンポラリファイルがいまいちなのだが.まいいか.
で,スクリプトはこう書く.
test.c:
#!/usr/local/bin/gccx #include <stdio.h> int main() { printf("hello world\n"); return 0; }
で,実行.
% ./test.c Badly placed (.
あれ? できない.test.c が csh で実行されているっぽい.なんだこれ.ごそごそ.
Tips.3
シェバング行に記述するコマンドは、必ずバイナリでなくてはならい。http://x68000.q-e-d.net/~68user/unix/pickup?%A5%B7%A5%A7%A5%D0%A5%F3%A5%B0
…そうか,再帰的にスクリプトを実行をしてくれたりはしないのか.逃げ道もわかったのでやってみる.
#!/usr/bin/env gccx #include <stdio.h> int main() { printf("hello world\n"); return 0; }
な感じ.むー,微妙.もちろん gccx をバイナリ化すればいいんだけど,所詮お遊びなのでそこまでする気なし.
ちなみに,gcc -xc - な技を知るまでは,
#include "/dev/stdin"
なファイルを別に用意してました.これの元ネタはたしか エキスパートCプログラミング だったはず.ただし,/dev/stdin じゃなくて /dev/tty だったと思うけど.「世界一汎用性の高いプログラム」だったか何だかそんなの.
最終更新時間: 2009-01-04 15:31