PhantomJSでワンライナー

SpiderMonkeyRhinoNode.jsといったJavaScriptの処理系には引数に記述したスクリプトを実行する -e オプションがある。一方でPhantomJS 1.4.1にはそのようなオプションは無いようだ。

なので現時点ではコンソールからPhantomJSでワンライナーすることはできないのだけど、できないと分かった途端に意味もなくワンライナーしたくなるのが人情なので、ちょっとした仕組みを作ってみた。

/*jslint devel: true, evil: true, maxerr: 50, indent: 2 */
/*global phantom: false */
(function () {
  'use strict';
  if (phantom.args.length !== 1) {
    console.error('usage: phantomjs ' + phantom.scriptName + ' "evaluate script"');
    phantom.exit(1);
  }

  try {
    eval(phantom.args[0]);
  } catch (e) {
    if (e instanceof Error) {
      console.error(e.name + ": " + e.message);
    } else {
      console.error("Unknown error occured");
    }
    phantom.exit(2);
  }
  phantom.exit(0);
}());

結構適当だし思いっきり eval を使っているので危なっかしいけど、これでワンライナーできる。

D:\temp>phantomjs phantomjs_oneliner.js "console.log('hello, world')"
hello, world

D:\temp>phantomjs phantomjs_oneliner.js "for (var i in [0, 0, 0]) console.log(i)"
0
1
2

D:\temp>phantomjs phantomjs_oneliner.js "for (var s in { foo: 0, bar: 0, baz: 0 }) console.log(s)"
foo
bar
baz

D:\temp>

ワンライナーするコードにも「'use strict'」が適用されるので注意。

あとはバッチファイルやシェルスクリプトでラッピングするだけ。

@echo off
phantomjs "%~dp0phantomjs_oneliner.js" %*
D:\temp>phantomol.bat "console.log('hello, world')"
hello, world

D:\temp>

作ってみたけど、需要はなさそうだ。