【问题标题】:How can I determine the OS of the system from within a Lua script?如何从 Lua 脚本中确定系统的操作系统?
【发布时间】:2010-09-22 15:26:13
【问题描述】:

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

【问题讨论】:

    标签: lua environment-variables


    【解决方案1】:

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

    【讨论】:

    • 这是一个简单而聪明的答案
    • 只是为了备份:Lua 5.3 reference
    • 在 Win10 上使用 Lua 5.3,print(package.config:sub(1,1)) 产生 '\' 而不是 '\\' 正如 mnicky 在 2013 年所声称的那样。但是不同的好主意无论如何,从 Linux 中获胜 :-)。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      编译 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
      

      【讨论】:

      • 很抱歉以这种方式发帖,我不习惯堆栈溢出。
      • 在所有情况下都不太可靠。我有一个嵌入 lua 解释器的 C 程序,并且 lua 代码在 OSX 上将 Linux 作为 BinaryFormat 返回。
      • 我在 OSX 上遇到了同样的问题
      【解决方案4】:

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

      【讨论】:

      • 检测文件夹,例如 MAC OS 的 /Applications,GNU/Linux 的 /home(在尝试 MAC OS 之后),最后 C:/WindowsC:/WINNT 对我来说是一个很好的解决方案。跨度>
      【解决方案5】:

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

      【讨论】:

      • 在我检查过的每个 Windows 版本上,都没有 HOME 环境变量。尝试从命令提示符执行“echo %HOME%”。
      • Windows 7(v 6.1, build 7601) 有 HOME,你检查了什么操作系统版本?
      • 在 Windows 7 上也是如此。 “echo %HOME%”命令会打印什么?
      • 可能是因为我安装了cygwin
      • 我的win7 pro 64位有HOMEPATHHOMEDRIVE,但没有HOME。我没有 Cygwin。恕我直言,检查环境将是脆弱的,因为任何用户都可能拥有像 Cygwin 这样的东西,或者已经决定 HOME 很方便。另外,在 Cygwin 下运行时,系统真的是 Windows 了吗?这很快就变成了一个棘手的问题。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-28
      • 2010-12-21
      • 2012-04-29
      • 1970-01-01
      • 2017-12-18
      • 1970-01-01
      相关资源
      最近更新 更多