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

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


person Robert Gould    schedule 17.11.2008    source источник


Ответы (5)


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

person Norman Ramsey    schedule 28.11.2008

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

person mnicky    schedule 20.01.2013
comment
это простой и умный ответ - person tcpiper; 01.09.2016
comment
просто для подтверждения: справочник по Lua 5.3 - person Chris K; 18.06.2017
comment
С Lua 5.3 на Win10 print(package.config:sub(1,1)) выдает '\', а не '\\', как утверждал mnicky в 2013 году. Но отличная идея, чтобы отличить Win от Linux :-), во всяком случае . - person Rolf Hemmerling - user3283760; 07.06.2021

Когда 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
person Matías Hermosilla    schedule 21.06.2015
comment
Прошу прощения за публикацию таким образом, я не привык к переполнению стека. - person Matías Hermosilla; 21.06.2015
comment
Не во всех случаях достаточно надежен. У меня есть программа C, в которую встроен интерпретатор lua, и код lua возвращает Linux как BinaryFormat в OSX. - person hookenz; 02.12.2015
comment
У меня такая же проблема на OSX - person Chris Beck; 05.03.2016

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

person Vinko Vrsalovic    schedule 17.11.2008
comment
Обнаружение таких папок, как /Applications для MAC OS, /home (после попытки MAC OS) для GNU/Linux и, наконец, C:/Windows и C:/WINNT, является для меня хорошим решением. - person MARTIN Damien; 20.01.2013

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

person Gabriele D'Antona    schedule 17.11.2008
comment
В каждой версии Windows, которую я проверял, нет переменной среды HOME. Попробуйте сделать echo %HOME% из командной строки. - person Gabriele D'Antona; 21.10.2012
comment
В Windows 7 (v 6.1, сборка 7601) есть HOME, какую версию ОС вы проверяли? - person baye; 21.10.2012
comment
На виндовс 7 тоже. Что выводит команда echo %HOME%? - person Gabriele D'Antona; 21.10.2012
comment
может быть, это потому, что у меня установлен cygwin - person baye; 06.11.2012
comment
В моей 64-разрядной версии win7 pro есть HOMEPATH и HOMEDRIVE, но нет HOME. У меня нет Цигвина. ИМХО, проверка среды будет хрупкой, поскольку у любого пользователя может быть что-то вроде Cygwin или он решил, что HOME удобен. Кроме того, при работе под Cygwin система действительно больше не Windows? Это быстро становится острым вопросом. - person RBerteig; 24.04.2013
comment
Я только что потратил час, пытаясь отладить сценарий Lua, который использует метод $HOME для обнаружения ОС. По какой-то причине моя среда Windows получила этот набор, и последовал хаос. Найдите другой способ (упомянутый выше package.config:sub(1,1) работает хорошо). - person Perry; 17.05.2014