20

わかりました、Lua スクリプトからシステムの OS を判別する必要がありますが、Lua 自体にはこのための API がないため、os.getenv() を使用して環境変数を照会します。Windows で環境変数「OS」をチェックすると、システムの OS の名前がわかりますが、Windows と Unix のほとんどのフレーバーの両方に存在する、チェックできる変数はありますか?

4

5 に答える 5

30

あなたは試すことができpackage.config:sub(1,1)ます。'\\'WindowsとUnixにあるパス区切り文字を返します'/'...

于 2013-01-20T15:08:01.763 に答える
10

Unix システムでは、os.capture が以下で定義されている os.capture 'uname' を試してください。

関数 os.capture(cmd, raw)
  ローカル f = アサート (io.popen(cmd, 'r'))
  ローカル s = assert(f:read('*a'))
  f:閉じる()
  raw の場合は end を返します
  s = string.gsub(s, '^%s+', '')
  s = string.gsub(s, '%s+$', '')
  s = string.gsub(s, '[\n\r]+', ' ')
  戻り値
終わり

これは、UNIX のすべてのフレーバーと Mac OSX で役立ちます。失敗した場合、Windows システムを使用している可能性がありますか? または、os.getenv 'HOME' を確認してください。

于 2008-11-28T21:05:00.437 に答える
6

lua がコンパイルされると、コンパイル対象のオペレーティング システムに応じて若干異なる設定が行われます。

したがって、'package' モジュールに設定されている多くの文字列を使用して、どのシステム用にコンパイルされたかを区別できます。

たとえば、動的ライブラリとして配布されている C ベースのモジュールを lua がロードする場合、Lua はそれらのライブラリに使用される拡張子を認識している必要がありますが、これは OS ごとに異なります。

したがって、次のような関数を使用して OS を判別できます。

local BinaryFormat = package.cpath:match("%p[\\|/]?%p(%a+)")
if BinaryFormat == "dll" then
    function os.name()
        return "Windows"
    end
elseif BinaryFormat == "so" then
    function os.name()
        return "Linux"
    end
elseif BinaryFormat == "dylib" then
    function os.name()
        return "MacOS"
    end
end
BinaryFormat = nil
于 2015-06-21T00:06:46.257 に答える
4

Windows/Unix の検出だけが必要な場合は、ファイルシステムに /etc または /bin または /boot ディレクトリが存在するかどうかを確認できると思います。さらに、どのディストリビューションかを知る必要がある場合、ほとんどの Linux ディストリビューションは /etc にディストリビューションとバージョンを示す小さなファイルを持っていますが、悲しいことに、それらはすべて異なる名前を付けています。

于 2008-11-17T07:34:19.140 に答える
1

Unix には $HOME 変数が必要なので (Windows にはありません)、OS 変数が空であることを確認した後で確認できます。

于 2008-11-17T07:28:37.700 に答える