2008-11-17 12 views
16

ठीक है मुझे लूआ स्क्रिप्ट से सिस्टम के ओएस को निर्धारित करने की आवश्यकता है, लेकिन लुआ इस तरह के लिए कोई एपीआई नहीं है, इसलिए मैं os.getenv() और क्वेरी पर्यावरण चर का उपयोग करता हूं। विंडोज़ पर एनवायरमेंटल वैरिएबल "ओएस" की जांच करने से मुझे सिस्टम के ओएस का नाम मिलता है, लेकिन क्या कुछ वैरिएबल है जो विंडोज़ और यूनिक्स के अधिकांश स्वादों पर मौजूद है जिन्हें चेक किया जा सकता है?मैं लुआ लिपि के भीतर से सिस्टम के ओएस को कैसे निर्धारित कर सकता हूं?

उत्तर

9

एक यूनिक्स प्रणाली पर, कोशिश 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 

यह यूनिक्स की और मैक OSX पर सभी जायके पर मदद मिलेगी। यदि यह विफल रहता है, तो आप Windows सिस्टम पर हो सकते हैं? या os.getenv 'होम' की जांच करें।

1

Unixes $ HOME चर (जबकि Windows कि नहीं है) होना चाहिए, ताकि आप इसे जांच कर सकते हैं (जाँच ओएस चर रिक्त है के बाद)।

+1

विंडोज़ = HOME = साथ ही –

+1

मैंने देखा है कि प्रत्येक विंडोज संस्करण पर, कोई घर पर्यावरण चर नहीं है। कमांड प्रॉम्प्ट से "echo% HOME%" करने का प्रयास करें। –

+0

विंडोज 7 (वी 6.1, बिल्ड 7601) में होम है, आपने किस ओएस संस्करण की जांच की? –

4

मुझे लगता है कि अगर आप सिर्फ विंडोज/यूनिक्स का पता लगाने की जरूरत है, तो आप/आदि या/बिन या/बूट निर्देशिका के अस्तित्व के लिए फाइल सिस्टम की जांच कर सकता लगता है। आमतौर पर, यदि आपको यह पता होना चाहिए कि कौन सा डिस्ट्रो है, तो अधिकांश लिनक्स डिस्ट्रोज़ में थोड़ी सी फाइलें होती हैं जो कि डिस्ट्रो और संस्करण दिखाती हैं, दुख की बात है कि वे सभी इसे अलग-अलग नाम देते हैं।

+0

जीएनयू/लिनक्स और फिनली 'सी:/विंडोज' और' सी:/WINNT' के लिए मैक ओएस के लिए '/ एप्लीकेशन' जैसे '/ एप्लीकेशन' जैसे मैक ओएस के लिए फ़ोल्डरों का पता लगाना, मेरे लिए एक अच्छा समाधान है। –

14

आप package.config:sub(1,1) कोशिश कर सकते हैं। यह पथ विभाजक है, जो विंडोज पर '\\' और '/' Unixes पर है ...

+0

यह एक सरल और चालाक जवाब – tcpiper

+0

सिर्फ इस बैकअप लेने के लिए है: [लुआ 5.3 संदर्भ] (http://www.lua.org/manual/5.3/manual.html#pdf-package.config) –

4

जब lua संकलित किया गया है, यह थोड़ा अलग ढंग से कॉन्फ़िगर किया गया है क्या ऑपरेटिंग सिस्टम इसके लिए संकलित किया गया है के आधार पर देता है।

श्रृंखलाएं जिनमें 'पैकेज' मॉड्यूल में स्थापित कर रहे हैं में से कई लोग इस प्रकार भेद करने के लिए जो प्रणाली इसके लिए संकलित किया गया था इस्तेमाल किया जा सकता।

उदाहरण के लिए, lua भार सी-आधारित जब मॉड्यूल जो गतिशील पुस्तकालयों के रूप में वितरित कर रहे हैं, यह उन पुस्तकालयों के लिए इस्तेमाल किया विस्तार है, जो प्रत्येक ओएस पर अलग है पता करने के लिए है।

इस प्रकार, आप ओएस निर्धारित करने के लिए निम्न जैसे फ़ंक्शन का उपयोग कर सकते हैं।

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 
+0

मैं माफी चाहता हूँ इस तरह से पोस्ट करने के लिए, मुझे अतिप्रवाह ढेर करने के लिए उपयोग नहीं किया जाता है। –

+1

सभी मामलों में काफी विश्वसनीय नहीं है। मेरे पास एक सी प्रोग्राम है जो लुआ दुभाषिया को एम्बेड करता है और लुआ कोड ओएसएक्स पर बाइनरीफॉर्मैट के रूप में लिनक्स लौट रहा है। – Matt

+0

मेरे पास ओएसएक्स पर एक ही समस्या है –

संबंधित मुद्दे