インタプリタ無改造! Lua on Windows で shebang

  • 3
    Like
  • 0
    Comment

Perl には -Sx オプションがあって、Perl を呼び出したバッチファイルそのものを、Perl スクリプトと一体化させることができました。

標準の Lua には、そういうオプションはありませんが、ちょっとした工夫で同等のものができました。

::rem:: --[[
@lua "%~f0" %1 %2 %3 %4 %5 %6 %7 %8 %9 & exit /b
]]--

print(string.format("[%s]",arg[1]))
-- vim:set ft=lua:
  • -S (PATHを検索する) のかわりに "%~f0" を使って、CMD.EXE にバッチファイルのフルパスに置換してもらう。
  • -x (バッチコマンド行を読み飛ばす)のかわりに rem と --[[コメント文]]-- を使う。

バッチファイルのラベル構文(:ラベル)と、Lua のラベル構文(::ラベル::)が似ていたのがラッキーでした。ただ、このやり方は Windows の CMD.EXE の機能に依存しているので、OS/2 や DOS では動きません。

Windows には拡張子とアプリケーションの関連付け機能があるので、別段、バッチファイルにスクリプトを組み込めてもそれほど嬉しくはありません。ですが、関連付けを予めしておかなくても済むので、static link で作成した lua.exe(あるいは NYAOS.EXE)とバッチファイル二つだけを持ち歩けばどこでも動かせるというのは、それなりに便利かと思います。

Lua 5.1 の場合

ラベル構文は Lua 5.2 から導入された文法なので、Lua 5.1 の場合は:

rem = [[
@lua "%~f0" %1 %2 %3 %4 %5 %6 %7 %8 %9 & exit /b
]]

で逃げる形になります。1行目がエコーされてしまうので、ややみっともない点は否めませんが。