为什么在Windows上,LUA_PATH中包含叹号(!)会被破坏?

我有一个名为main.lua的文件:

require("hello")

还有一个在目录foo bar! baz(包含!)中名为hello.lua的文件:

module(...,package.seeall)
print("hello from hello.lua")

当我将(在Windows上)环境变量LUA_PATH设置为目录时:

set LUA_PATH="C:\Programme\Lua\5.1\foo bar! baz\?.lua"

我遇到了一个奇怪的错误:

C:\Programme\Lua\5.1>lua main.lua
lua: main.lua:4: module 'hello' not found:
        no field package.preload['hello']
        no file '"C:\Programme\Lua\5.1\foo barC:\Programme\Lua\5.1 baz\hello.lua
"'
        no file '.\hello.dll'
        no file '.\hello51.dll'
        no file 'C:\Programme\Lua\5.1\hello.dll'
        no file 'C:\Programme\Lua\5.1\hello51.dll'
        no file 'C:\Programme\Lua\5.1\clibs\hello.dll'
        no file 'C:\Programme\Lua\5.1\clibs\hello51.dll'
        no file 'C:\Programme\Lua\5.1\loadall.dll'
        no file 'C:\Programme\Lua\5.1\clibs\loadall.dll'
stack traceback:
        [C]: in function 'require'
        main.lua:4: in main chunk
        [C]: ?

看到非常奇怪的路径C:\Programme\Lua\5.1\foo barC:\Programme\Lua\5.1 baz\hello.lua了吗?感叹号(bang)有什么特殊之处?如何在Windows上解决这个问题?在Mac上似乎可以正常工作。

点赞
用户1217408
用户1217408

这个替换仅在Lua第一次设置路径时发生(从 LUA_PATH 或来自 luaconf 的默认设置)。如果您通过其他方式设置路径,可以避免这个问题。

更多信息和可能的替代方案:http://lua-users.org/lists/lua-l/2012-08/msg00052.html

2012-10-15 18:44:04
用户1442917
用户1442917

这个解释是正确的(在Windows上是记录下来的行为),但我也可以提供一种可能的解决方法(或者说是一个解决办法):由于只有第一个感叹号将被替换,因此不要使用 set LUA_PATH="C:\Programme\Lua\5.1\foo bar! baz\?.lua",而是使用:

set LUA_PATH="!\foo bar! baz\?.lua"
2014-10-19 05:44:35