Comment puis-je déterminer L'OS du système à partir d'un script Lua?

Ok je dois déterminer L'OS du système à partir d'un script Lua, mais Lua en tant que tel n'a pas D'API pour cela, donc j'utilise os.getenv () et interrogation des variables environnementales. Sur Windows, la vérification de la variable environnementale " OS " me donne le nom de L'OS du système, mais y a-t-il une variable qui existe à la fois sur Windows et la plupart des saveurs D'Unix qui peut être vérifiée?

17
demandé sur Robert Gould 2008-11-17 10:24:06

5 réponses

sur un système Unix, essayez os.capturez "uname" où os.la capture est définie ci-dessous:

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

cela aidera sur toutes les saveurs d'unix et sur Mac OSX. Si elle échoue, vous pourriez être sur un système Windows? Ou vérifier les os.la fonction getenv "MAISON".

10
répondu Norman Ramsey 2008-11-28 21:05:00

Vous pouvez essayer package.config:sub(1,1). Elle renvoie le séparateur de chemin, qui est '\' sur Windows et '/' sur les systèmes Unix...

16
répondu mnicky 2013-01-20 15:08:01

je suppose que si vous avez juste besoin D'une détection Windows/Unix, vous pouvez vérifier l'existence de répertoires /etc ou /bin ou /boot dans le système de fichiers. Aditionnellement, si vous avez besoin de savoir quelle distribution est-elle, la plupart des distributions Linux ont un petit fichier dans /etc montrant la distribution et la version, malheureusement ils tous le nom différemment.

4
répondu Vinko Vrsalovic 2008-11-17 07:34:19

quand lua est compilé, il est configuré légèrement différemment selon le système d'exploitation pour lequel il est compilé.

de nombreuses chaînes qui sont définies dans le module' package ' peuvent donc être utilisées pour distinguer le système pour lequel elles ont été compilées.

par exemple, lorsque lua charge des modules basés sur C qui sont distribués comme bibliothèques dynamiques, il doit connaître l'extension utilisée pour ces bibliothèques, qui est différente sur chaque OS.

Ainsi, vous pouvez utiliser un fonction comme la suivante pour déterminer L'OS.

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
4
répondu Matías Hermosilla 2015-10-16 18:59:08

Unixes devrait avoir la variable $HOME (alors que Windows ne l'a pas), donc vous pouvez la vérifier (après avoir vérifié que la variable D'OS est vide).

1
répondu Gabriele D'Antona 2008-11-17 07:28:37