2008-11-17 12 views
16

Ok Necesito determinar el sistema operativo del sistema desde un script Lua, pero Lua como tal no tiene API para esto, así que uso os.getenv() y variables de entorno de consulta. En Windows, verificando la variable ambiental "OS" me da el nombre del sistema operativo del sistema, pero ¿hay alguna variable que exista tanto en Windows como en la mayoría de los sabores de Unix que se pueda verificar?¿Cómo puedo determinar el sistema operativo del sistema desde un script Lua?

Respuesta

9

En un sistema Unix, intente os.capture 'uname' donde os.capture se define a continuación:

 
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 

Esto ayudará en todas las versiones de Unix y en Mac OSX. Si falla, ¿podría estar en un sistema Windows? O consulte os.getenv 'HOME'.

1

Unixes debe tener la variable $ HOME (mientras que Windows no tiene eso), por lo que puede verificarlo (después de comprobar que la variable del sistema operativo está vacía).

+1

Windows ha INICIO = =, así –

+1

En cada versión de Windows que he comprobado, no hay ninguna variable de entorno HOME. Intenta hacer "echo% HOME%" desde el símbolo del sistema. –

+0

Windows 7 (v 6.1, compilación 7601) tiene HOME, ¿qué versión de sistema operativo revisó? –

4

Supongo que si solo necesita la detección de Windows/Unix, puede verificar la existencia de directorios/etc o/bin o/boot en el sistema de archivos. Además, si necesita saber qué distribución es, la mayoría de las distribuciones de Linux tienen un pequeño archivo en/etc que muestra la distribución y la versión, lamentablemente todos lo nombran de manera diferente.

+0

Detectando carpetas como '/ Applications' para MAC OS,'/home' (después de probar MAC OS) para GNU/Linux y finalmente 'C:/Windows' y' C:/WINNT' es una buena solución para mí. –

14

Puede intentar package.config:sub(1,1). Devuelve el separador de ruta, que es '\\' en Windows y '/' en Unixes ...

+0

esta es una respuesta simple e inteligente – tcpiper

+0

solo para respaldar esto: [referencia de Lua 5.3] (http://www.lua.org/manual/5.3/manual.html#pdf-package.config) –

4

Cuando se compila lua, se configura ligeramente diferente según el sistema operativo para el que se compila.

Muchas de las cadenas que se configuran en el módulo 'paquete' se pueden usar para distinguir para qué sistema se compiló.

Por ejemplo, cuando lua carga módulos basados ​​en C que se distribuyen como bibliotecas dinámicas, debe conocer la extensión utilizada para esas bibliotecas, que es diferente en cada sistema operativo.

Por lo tanto, puede usar una función como la siguiente para determinar el sistema operativo.

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 
+0

Lo siento por publicar esto de esa manera, no estoy acostumbrado a acumular desbordamiento. –

+1

No es del todo confiable en todos los casos. Tengo un programa C que incorpora el intérprete lua y el código lua devuelve Linux como el BinaryFormat en OSX. – Matt

+0

Tengo el mismo problema en OSX –

Cuestiones relacionadas