Как определить ОС системы из сценария Lua? - PullRequest
18 голосов
/ 17 ноября 2008

Хорошо, мне нужно определить операционную систему из сценария Lua, но Lua как таковой не имеет API для этого, поэтому я использую os.getenv () и запрашиваю переменные среды. При проверке Windows переменная окружения «OS» дает мне имя операционной системы, но есть ли какая-нибудь переменная, которая существует как в Windows, так и в большинстве разновидностей Unix, которые можно проверить?

Ответы [ 5 ]

20 голосов
/ 20 января 2013

Вы можете попробовать package.config:sub(1,1). Он возвращает разделитель пути, который '\\' в Windows и '/' в Unixes ...

10 голосов
/ 29 ноября 2008

В системе 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'.

4 голосов
/ 21 июня 2015

Когда компилируется lua, он настраивается немного по-разному в зависимости от операционной системы, для которой он компилируется.

Таким образом, многие из строк, которые установлены в модуле 'package', могут использоваться для определения, для какой системы он был скомпилирован.

Например, когда 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
4 голосов
/ 17 ноября 2008

Полагаю, что если вам просто нужно обнаружение Windows / Unix, вы можете проверить файловую систему на наличие каталогов / etc, / bin или / boot. Кроме того, если вам нужно знать, какой это дистрибутив, у большинства дистрибутивов Linux есть небольшой файл в / etc, показывающий дистрибутив и версию, к сожалению, все они называют его по-разному.

1 голос
/ 17 ноября 2008

У Unix-ов должна быть переменная $ HOME (в то время как в Windows ее нет), так что вы можете проверить ее (после проверки, что переменная ОС пуста).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...