4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2013-05-18

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行目がエコーされてしまうので、ややみっともない点は否めませんが。

4
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?