2008-11-17 2 views
16

Ok Ich muss das Betriebssystem des Systems von einem Lua-Skript bestimmen, aber Lua als solches hat keine API dafür, also verwende ich os.getenv() und frage Umgebungsvariablen ab. Unter Windows gibt mir die Umgebungsvariable "OS" den Namen des Betriebssystems des Systems, aber gibt es eine Variable, die sowohl auf Windows als auch auf den meisten Unix-Versionen existiert, die überprüft werden können?Wie kann ich das Betriebssystem des Systems in einem Lua-Skript ermitteln?

Antwort

9

Auf einem Unix-System, versuchen os.capture 'uname' wo os.capture unten definiert ist:

 
function os.capture(cmd, raw) 
    local f = assert(io.popen(cmd, 'r')) 
    local s = assert(f:read('*a')) 
    f:close() 
    if raw then return s end 
    s = string.gsub(s, '^%s+', '') 
    s = string.gsub(s, '%s+$', '') 
    s = string.gsub(s, '[\n\r]+', ' ') 
    return s 
end 

Diese auf allen Versionen von Unix helfen und auf Mac OSX. Wenn dies fehlschlägt, sind Sie möglicherweise auf einem Windows-System? Oder überprüfen Sie os.getenv 'HOME'.

1

Unixe sollten die Variable $ HOME haben (während Windows das nicht hat), so dass Sie es überprüfen können (nachdem die OS-Variable leer ist).

+1

Windows hat = HOME = auch –

+1

Auf jeder Windows-Version, die ich überprüft habe, gibt es keine HOME-Umgebungsvariable. Versuchen Sie "echo% HOME%" an der Eingabeaufforderung zu tun. –

+0

Windows 7 (v 6.1, Build 7601) hat HOME, welche OS-Version haben Sie überprüft? –

4

Ich denke, wenn Sie nur Windows/Unix-Erkennung benötigen, könnten Sie das Dateisystem für das Vorhandensein von/etc oder/bin oder/boot Verzeichnisse überprüfen. Außerdem, wenn Sie wissen müssen, welche Distribution es ist, haben die meisten Linux Distributionen eine kleine Datei in/etc, die die Distribution und Version anzeigt, leider nennen sie alle anders.

+0

Das Erkennen von Ordnern wie '/ Applications' für MAC OS,'/home' (nach dem Versuch MAC OS) für GNU/Linux und schließlich 'C:/Windows' und' C:/WINNT' ist eine gute Lösung für mich. –

14

Sie können versuchen package.config:sub(1,1). Es gibt das Pfadtrennzeichen zurück, '\\' unter Windows und '/' unter Unix ...

+0

Dies ist eine einfache und clevere Antwort – tcpiper

+0

nur um dies zu unterstützen: [Lua 5.3 Referenz] (http://www.lua.org/manual/5.3/manual.html#pdf-package.config) –

4

Wenn lua kompiliert wird, wird es je nach dem Betriebssystem, für das es kompiliert wird, etwas anders konfiguriert.

Viele der Strings, die im Modul 'package' gesetzt sind, können so verwendet werden, um zu unterscheiden, für welches System es kompiliert wurde.

Zum Beispiel, wenn lua lädt C-basierte Module, die als dynamische Bibliotheken verteilt sind, muss es die Erweiterung für diese Bibliotheken verwendet, die auf jedem Betriebssystem unterscheidet.

So können Sie eine Funktion wie die folgende verwenden, um das Betriebssystem zu bestimmen.

+0

Es tut mir leid um das auf diese Weise zu posten, bin ich es nicht gewohnt, einen Überlauf zu stapeln. –

+1

In allen Fällen nicht ganz zuverlässig. Ich habe ein C-Programm, das den Lua-Interpreter einbettet, und der Lua-Code gibt Linux als BinaryFormat auf OSX zurück. – Matt

+0

Ich habe das gleiche Problem auf OSX –

Verwandte Themen