LUA 스크립트 내에서 시스템의 OS를 어떻게 결정할 수 있습니까?

StackOverflow https://stackoverflow.com/questions/295052

  •  08-07-2019
  •  | 
  •  

문제

OK LUA 스크립트에서 시스템의 OS를 결정해야하지만 LUA에는 이에 대한 API가 없으므로 OS.getenv () 및 쿼리 Enviromental 변수를 사용합니다. Windows에서 Enviromental 변수 "OS"를 확인하면 시스템 OS의 이름을 제공하지만 Windows와 UNIX의 대부분의 풍미에 존재하는 변수가 있습니까?

도움이 되었습니까?

해결책

UNIX 시스템에서 OS.capture 'Uname'을 사용해보십시오. 여기서 os.capture가 아래에 정의되어 있습니다.

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

이것은 유닉스의 모든 맛과 Mac OSX에 도움이됩니다. 실패하면 Windows 시스템에있을 수 있습니까? 또는 os.getenv 'home'을 확인하십시오.

다른 팁

당신은 시도 할 수 있습니다 package.config:sub(1,1). 그것은 경로 분리기를 반환합니다 '\\' 창문과 '/' Unixes에서 ...

Windows /Unix Detection이 필요한 경우 /etc 또는 /bin 또는 /boot 디렉토리의 존재에 대해 파일 시스템을 확인할 수 있다고 생각합니다. 준수적으로, 어떤 배포판인지 알아야 할 경우 대부분의 Linux 배포판에는 배포판과 버전을 보여주는 /etc에 작은 파일이 있습니다. 슬프게도 모두 다르게 이름을 지정합니다.

LUA가 컴파일되면 컴파일 된 운영 체제에 따라 약간 다르게 구성됩니다.

따라서 '패키지'모듈에 설정된 많은 문자열을 사용하여 컴파일 된 시스템을 구별 할 수 있습니다.

예를 들어, LUA가 동적 라이브러리로 분산 된 C 기반 모듈을로드 할 때 각 OS마다 다른 라이브러리에 사용 된 확장을 알아야합니다.

따라서 다음과 같은 함수를 사용하여 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

Unixes는 $ home 변수가 있어야합니다 (Windows에는이지가 없습니다). (OS 변수를 확인한 후 비어 있음) 확인할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top