Хорошо, мне нужно определить ОС системы из сценария Lua, но у Lua как такового нет API для этого, поэтому я использую os.getenv() и запрашиваю переменные среды. В Windows проверка переменной среды «OS» дает мне имя ОС системы, но есть ли какая-то переменная, которая существует как в Windows, так и в большинстве разновидностей Unix, которую можно проверить?
Как я могу определить ОС системы из скрипта Lua?
Ответы (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'.
Вы можете попробовать package.config:sub(1,1)
. Он возвращает разделитель пути, который равен '\\'
в Windows и '/'
в Unix...
Когда 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
Я предполагаю, что если вам просто нужно обнаружение Windows/Unix, вы можете проверить файловую систему на наличие каталогов /etc или /bin или /boot. Кроме того, если вам нужно знать, какой это дистрибутив, в большинстве дистрибутивов Linux есть небольшой файл в /etc, показывающий дистрибутив и версию, к сожалению, все они называют его по-разному.
/Applications
для MAC OS, /home
(после попытки MAC OS) для GNU/Linux и, наконец, C:/Windows
и C:/WINNT
, является для меня хорошим решением.
- person MARTIN Damien; 20.01.2013
В Unix должна быть переменная $HOME (в то время как в Windows ее нет), поэтому вы можете проверить ее (после проверки того, что переменная ОС пуста).
HOMEPATH
и HOMEDRIVE
, но нет HOME
. У меня нет Цигвина. ИМХО, проверка среды будет хрупкой, поскольку у любого пользователя может быть что-то вроде Cygwin или он решил, что HOME
удобен. Кроме того, при работе под Cygwin система действительно больше не Windows? Это быстро становится острым вопросом.
- person RBerteig; 24.04.2013
$HOME
для обнаружения ОС. По какой-то причине моя среда Windows получила этот набор, и последовал хаос. Найдите другой способ (упомянутый выше package.config:sub(1,1)
работает хорошо).
- person Perry; 17.05.2014