如何从Lua脚本中确定系统的操作系统?

问题描述:

好吧,我需要从Lua脚本中确定系统的操作系统,但Lua本身没有API,所以我使用os.getenv()和查询环境变量。在Windows上检查环境变量“OS”给我的系统的操作系统的名称,但是有一些变量存在于Windows和大多数Unix的口味可以检查?如何从Lua脚本中确定系统的操作系统?

在Unix系统中,尝试os.capture 'UNAME',其中os.capture定义如下:

 
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 

这将有助于在Unix和Mac OSX上的所有口味。 如果失败,您可能在Windows系统上?或者检查os.getenv'HOME'。

Unix应该有$ HOME变量(而Windows没有),所以你可以检查它(在检查OS变量为空之后)。

+1

windows has = HOME =以及 – 2012-10-20 01:20:07

+1

在我检查过的每个Windows版本中,没有HOME环境变量。尝试从命令提示符执行“echo%HOME%”。 – 2012-10-21 08:09:31

+0

Windows 7(v 6.1,build 7601)拥有HOME,您检查了哪个操作系统版本? – 2012-10-21 08:15:30

我想如果你只是需要Windows/Unix检测,你可以检查文件系统是否存在/ etc或/ bin或/ boot目录。此外,如果您需要知道哪个发行版,大多数Linux发行版都会在/ etc中显示一些文件来显示发行版和版本,但不幸的是,它们都以不同的名称命名。

你可以试试package.config:sub(1,1)。它返回路径分隔符,在Windows上是'\\',在Unix上是'/' ...

当编译lua时,根据编译的操作系统的不同,它的配置稍有不同。

因此可以使用“包”模块中设置的许多字符串来区分它编译的系统。

例如,当lua加载以动态库形式分发的基于C的模块时,它必须知道这些库所使用的扩展,这在每个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