【发布时间】:2010-09-22 15:26:13
【问题描述】:
好的,我需要通过 Lua 脚本确定系统的操作系统,但 Lua 本身没有用于此的 API,因此我使用 os.getenv() 并查询环境变量。在 Windows 上检查环境变量“OS”给了我系统操作系统的名称,但是是否有一些变量存在于 Windows 和大多数风格的 Unix 上可以检查?
【问题讨论】:
好的,我需要通过 Lua 脚本确定系统的操作系统,但 Lua 本身没有用于此的 API,因此我使用 os.getenv() 并查询环境变量。在 Windows 上检查环境变量“OS”给了我系统操作系统的名称,但是是否有一些变量存在于 Windows 和大多数风格的 Unix 上可以检查?
【问题讨论】:
你可以试试package.config:sub(1,1)。它返回路径分隔符,在 Windows 上为 '\\',在 Unix 上为 '/'...
【讨论】:
在 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'。
【讨论】:
编译 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
【讨论】:
我猜如果你只需要 Windows/Unix 检测,你可以检查文件系统是否存在 /etc 或 /bin 或 /boot 目录。此外,如果您需要知道它是哪个发行版,大多数 Linux 发行版在 /etc 中都有一个小文件,显示发行版和版本,遗憾的是它们的名称都不同。
【讨论】:
/Applications,GNU/Linux 的 /home(在尝试 MAC OS 之后),最后 C:/Windows 和 C:/WINNT 对我来说是一个很好的解决方案。跨度>
Unix 应该有 $HOME 变量(而 Windows 没有),所以你可以检查它(在检查 OS 变量为空之后)。
【讨论】:
HOMEPATH和HOMEDRIVE,但没有HOME。我没有 Cygwin。恕我直言,检查环境将是脆弱的,因为任何用户都可能拥有像 Cygwin 这样的东西,或者已经决定 HOME 很方便。另外,在 Cygwin 下运行时,系统真的是 Windows 了吗?这很快就变成了一个棘手的问题。