SpiderMonkey、Rhino、Node.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>
作ってみたけど、需要はなさそうだ。