2008-11-17 207 views
16

好吧,我需要從Lua腳本中確定系統的操作系統,但Lua本身沒有API,所以我使用os.getenv()和查詢環境變量。在Windows上檢查環境變量「OS」給我的系統的操作系統的名稱,但是有一些變量存在於Windows和大多數Unix的口味可以檢查?如何從Lua腳本中確定系統的操作系統?

回答

9

在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'。

1

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

4

我想如果你只是需要Windows/Unix檢測,你可以檢查文件系統是否存在/ etc或/ bin或/ boot目錄。此外,如果您需要知道哪個發行版,大多數Linux發行版都會在/ etc中顯示一些文件來顯示發行版和版本,但不幸的是,它們都以不同的名稱命名。

14

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

4

當編譯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