好久不見の直訳らしい.へー.
ファイル名の代わりに - を使う,だけではうまくいかなくて,一緒に -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 だったと思うけど.「世界一汎用性の高いプログラム」だったか何だかそんなの.
2012 : 01 02 03 04 05 06 07 08 09 10 11 12
2011 : 01 02 03 04 05 06 07 08 09 10 11 12
2010 : 01 02 03 04 05 06 07 08 09 10 11 12
2009 : 01 02 03 04 05 06 07 08 09 10 11 12
2008 : 01 02 03 04 05 06 07 08 09 10 11 12
2007 : 01 02 03 04 05 06 07 08 09 10 11 12
2006 : 01 02 03 04 05 06 07 08 09 10 11 12
2005 : 01 02 03 04 05 06 07 08 09 10 11 12
2004 : 01 02 03 04 05 06 07 08 09 10 11 12
2003 : 01 02 03 04 05 06 07 08 09 10 11 12
2002 : 01 02 03 04 05 06 07 08 09 10 11 12
2001 : 01 02 03 04 05 06 07 08 09 10 11 12
2000 : 01 02 03 04 05 06 07 08 09 10 11 12
1999 : 01 02 03 04 05 06 07 08 09 10 11 12
1998 : 01 02 03 04 05 06 07 08 09 10 11 12
1997 : 01 02 03 04 05 06 07 08 09 10 11 12
1996 : 01 02 03 04 05 06 07 08 09 10 11 12
最終更新時間: 2012-02-13 02:02