3

假设我用这个 cmd 调用 Lua:

luajit neuralnetwork.lua --satEpoch "somestring" --maxEpoch 50

如何从 Lua 访问相同的命令行字符串?

我知道该arg表,但它从原始命令字符串中删除了所有引号,使其难以重建:

{
   "--maxEpoch"
   "--satEpoch"
   "50"
   "somestring"
   [-1] : "luajit"
   [0] : "examples/neuralnetwork.lua"
}

如果我可以将确切的字符串从 Lua 中保存到一个文件中,我以后可以轻松地再次调用它。

4

2 回答 2

4

@peterpi 是正确的,shell 正在解释命令并因此去掉引号。但是,要让 shell 以与以前相同的方式解释命令,实际上并不需要准确地重构命令。

对于简单的情况,将参数连接到脚本通常就足够了:

local command = table.concat(arg, ' ', -1, #arg)

如果引号实际上是必要的,这将失败,最常见的是当参数包含空格或 shell 字符时,因此引用所有内容很容易并且更健壮,但并不漂亮。

这是一个带有 Lua 模式的示例,用于检查特殊 (bash) shell 字符和空格,以确定是否需要以及哪些引号是必要的。它可能不完整,但它处理文件名、大多数字符串和数字作为参数。

local mod_arg = { }
for k, v in pairs(arg) do
    if v:find"'" then
      mod_arg[k] = '"'..v..'"'
    elseif v:find'[%s$`><|#]' then
      mod_arg[k] = "'"..v.."'"         
    else
      mod_arg[k] = v
    end
end 
local command = table.concat(mod_arg, ' ', -1, #mod_arg)
print(command)
于 2015-09-03T16:26:55.833 回答
1

毫无疑问,有人会证明我错了,但通常我认为这是不可能的。是外壳而不是 luajit 将引号去掉并将行分割成单独的标记。

于 2015-09-03T15:46:34.640 回答