Lua строка строки cmd

Скажем, я звоню Луа с этим cmd:

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

Как я могу получить доступ к этой же строке строки cmd из Lua?

Я знаю о arg table, но он удаляет все кавычки из исходной командной строки, что затрудняет восстановление:

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

Если я могу сохранить точную строку в файл из Lua, я могу легко вызвать ее позже.

2 ответа

Решение

@peterpi правильно, что оболочка интерпретирует команду и в результате удаляет кавычки. Однако для точного восстановления команды не требуется, чтобы оболочка интерпретировала команду так же, как и раньше.

Для простых случаев достаточно объединения аргументов в сценарии:

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

Это не удастся, если кавычки действительно необходимы, чаще всего, когда аргумент содержит пробел или символ оболочки, поэтому цитирование все легко и несколько надежнее, но не красиво.

Вот пример с шаблоном Lua для проверки специальных (bash) символов оболочки и пробелов, чтобы решить, нужны ли и какие кавычки. Он может быть неполным, но он обрабатывает имена файлов, большинство строк и числа в качестве аргументов.

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)

Без сомнения, кто-то докажет, что я неправ, но в целом я не думаю, что это возможно. Это оболочка, а не luajit, которая убирает кавычки и разбивает строку на отдельные токены.

Другие вопросы по тегам