2008-11-17 3 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

Unixes должен иметь переменную $ HOME (в то время как в Windows этого нет), поэтому вы можете ее проверить (после проверки переменной ОС пусто).

+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) имеет ДОМ, какую версию ОС вы проверяли? – 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, которые распространяются как динамические библиотеки, он должен знать расширение, используемое для этих библиотек, которое отличается для каждой ОС.

Таким образом, для определения ОС вы можете использовать следующую функцию.

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 
Смежные вопросы