3

このコマンドで 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は、シェルがコマンドを解釈し、その結果として引用符を取り除いていることは正しいです。ただし、シェルにコマンドを以前と同じように解釈させるために、コマンドを正確に再構築する必要はありません。

単純なケースでは、多くの場合、引数をスクリプトに連結するだけで十分です。

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

引用符が実際に必要な場合、最も一般的には引数にスペースまたはシェル文字が含まれている場合、これは失敗します。したがって、すべてを引用することは簡単で、やや堅牢ですが、きれいではありません。

これは、特別な (bash) シェル文字とスペースをチェックして、引用符が必要かどうか、どの引用符が必要かを判断する Lua パターンの例です。完全ではないかもしれませんが、ファイル名、ほとんどの文字列、および数値を引数として処理します。

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 に答える