我如何在Lua脚本中确定系统的操作系统?

我需要从 Lua 脚本中确定系统的操作系统(OS),但是 Lua 没有相应的 API,所以我使用 os.getenv() 和查询环境变量。在 Windows 上,检查环境变量"OS"可以获取系统的操作系统名称,但是是否存在某个变量在 Windows 和大多数 Unix 变种上都可检查呢?

原文链接 https://stackoverflow.com/questions/295052

点赞
stackoverflow用户23034
stackoverflow用户23034

Unixes应该有$ HOME变量(而Windows没有),因此您可以在检查OS变量为空之后检查它。

2008-11-17 07:28:37
stackoverflow用户5190
stackoverflow用户5190

我想如果你只需要检测 Windows/Unix,你可以检查文件系统是否存在 /etc 或者 /bin 或者 /boot 目录。此外,如果你需要知道是哪个发行版,大多数 Linux 发行版在 /etc 中都有一个显示发行版和版本的小文件,但很遗憾,它们都以不同的名称命名。

2008-11-17 07:34:19
stackoverflow用户41661
stackoverflow用户41661

在 Unix 系统上,尝试使用以下定义的 os.capture 'uname':

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'。

2008-11-28 21:05:00
stackoverflow用户626431
stackoverflow用户626431

你可以尝试使用 package.config:sub(1,1)。它会返回路径分隔符,在 Windows 下为 '\\' ,在 Unix 系统下为 '/'...

2013-01-20 15:08:01
stackoverflow用户5032278
stackoverflow用户5032278

当编译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
2015-06-21 00:06:46
stackoverflow用户2805176
stackoverflow用户2805176

FWIW(顺便说一句),我能想到的最简单的函数如下:

function MyScript:OS()
    return package.config:sub(1,1) == "\\" and "win" or "unix"
end
2022-10-14 18:39:41