#!(shabang)

みんな元気か!元気に#!打ってっか?


そういうことで、shでもperlでもrubyでもpythonでも
まーそのほかいろいろでも、cgiだのなんだのをスクリプト言語みたいなので
スクリプトファイルだけで動かしたきゃ

#!/usr/bin/perl

みたいのが必要なんだ。


でないと、

$ perl script.pl

みたいに実行しないといけない。


そこでgoogleのv8をshellで使いたいとする。
でもなんと、恐ろしい事に#!がヤツには通用しない。
なぜだ!
なので、ちょっと手を加えてみたよって言うお話。


ちなみに優秀な方は、「んなの常識だよ!」
って思ってらっしゃるかもしれないですが、ちょっと何言ってるかよく分からなかったので
ダサいやり方やってると思います。
たぶん、いろんな方のソース見ればもっとよく解決します。


まず、v8のshellの作り方は、こちらで
IT戦記
Google Chrome の JavaScript エンジン V8 を試す
http://d.hatena.ne.jp/amachang/20080903/1220405193


んで、僕が何を具体的にしてみたかっていうと、
javascriptって#がコメントアウトじゃないから、
スクリプト内に#!の記述があると、そこでエラーが出ちゃう。
だから、一行目に#!があったら、2行めからスクリプトとして評価してね
って言うプログラムをv8のサンプルで作れるshellに入れ込みましたって話。

sample/shell.cc
を書き換えてね。


もうめんどくせ。diffしたソース。

--- shell.cc.bk	2009-06-06 10:27:00.000000000 +0900
+++ shell.cc	2009-06-06 11:47:03.000000000 +0900
@@ -94,6 +94,12 @@
         printf("Error reading '%s'\n", str);
         return 1;
       }
+
+      v8::String::AsciiValue source_str(source);
+      if (strncmp(*source_str, "#!", 2) == 0) {
+          source = v8::String::New(strchr(*source_str, '\n'));
+      }
+
       if (!ExecuteString(source, file_name, false, true))
         return 1;
     }


あとは、またscons sample=shellみたいな感じでコンパイルし直すと
「#!」がつかえて、まぁいろいろ出来る訳です。