20

好的,我需要从 Lua 脚本中确定系统的操作系统,但是 Lua 本身没有用于此的 API,所以我使用 os.getenv() 并查询环境变量。在 Windows 上检查环境变量“OS”给了我系统操作系统的名称,但是在 Windows 和大多数风格的 Unix 上是否存在一些可以检查的变量?

4

5 回答 5

30

你可以试试package.config:sub(1,1)。它返回路径分隔符,'\\'在 Windows 和'/'Unix 上...

于 2013-01-20T15:08:01.763 回答
10

在 Unix 系统上,尝试 os.capture 'uname' ,其中 os.capture 定义如下:

函数 os.capture(cmd, raw)
  本地 f = 断言(io.popen(cmd,'r'))
  本地 s = assert(f:read('*a'))
  f:关闭()
  如果原始则返回 s 结束
  s = string.gsub(s, '^%s+', '')
  s = string.gsub(s, '%s+$', '')
  s = string.gsub(s, '[\n\r]+', ' ')
  返回
结尾

这将有助于所有风格的 unix 和 Mac OSX。如果失败,您可能在 Windows 系统上?或者检查 os.getenv 'HOME'。

于 2008-11-28T21:05:00.437 回答
6

编译 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
于 2015-06-21T00:06:46.257 回答
4

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

于 2008-11-17T07:34:19.140 回答
1

Unix 应该有 $HOME 变量(而 Windows 没有),所以你可以检查它(在检查 OS 变量为空之后)。

于 2008-11-17T07:28:37.700 回答