Подтвердить что ты не робот

Как определить ОС системы из Lua script?

Хорошо Мне нужно определить системную ОС из Lua script, но Lua как таковая не имеет API для этого, поэтому я использую os.getenv() и запрашиваю переменные окружения. В Windows проверка переменной среды "ОС" дает мне имя системной ОС, но есть ли какая-то переменная, которая существует как для Windows, так и для большинства вариантов Unix, которые можно проверить?

4b9b3361

Ответ 1

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

Ответ 2

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

Ответ 3

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

Ответ 4

Когда 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

Ответ 5

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