2012-02-14 13 views
9

मैं System.Environment.getEnv का उपयोग करके आसानी से एक पर्यावरण चर पढ़ सकता हूं। हालांकि, System.Environment में कोई संबंधित setEnv फ़ंक्शन नहीं है (जहां तक ​​मैं कह सकता हूं)।मैं क्रॉस-प्लेटफ़ॉर्म तरीके से पर्यावरण चर सेट कैसे कर सकता हूं?

कैसे मैं एक Haskell कार्यक्रम से एक वातावरण चर सेट करूँ? मैं एक क्रॉस-प्लेटफार्म समाधान पसंद करूंगा।

+1

ध्यान दें कि आधार 4.7.0 अब एक 'setEnv' है। –

+0

@EmmanuelTouzery: बहुत बढ़िया। क्या आप इसे बढ़ी हुई दृश्यता के उत्तर के रूप में डाल सकते हैं? धन्यवाद। –

उत्तर

3

ध्यान दें कि आधार 4.7.0 अब System.Environment में एक setEnv है। तो वर्तमान या निकट भविष्य के लिए इसे हल किया गया है।

हालांकि अगर आपको < 4.7.0 (जो वर्तमान में मेरा मामला है) में इस सुविधा की आवश्यकता है, तो मैंने इस काम को पुराने बेस संस्करण के साथ बनाने के लिए आवश्यक कार्यों को the commit that adds the feature से निकाला है।

हालांकि मैं गंभीरता से इस पर धैर्य खो दिया है और यह नहीं बल्कि बदसूरत किया, लेकिन यह मेरे लिए काम करता ...

गड़बड़ एक विंडोज़ वातावरण में कॉल करने के लिए 3 कार्यों देखते हैं कि है: putenv, SetEnvironmentVariableA (ASCII) और SetEnvironmentVariableW (वाइडचर, utf16)। आधार 4.7 के लिए प्रतिबद्ध पैच स्वचालित रूप से करता है, लेकिन मैंने समय की कमी से कुछ और बदसूरत किया (मैं इसे अभी तक साफ़ कर सकता हूं)।

यहाँ मैं क्या है:

setEnv_ :: String -> String -> IO() 
setEnv_ key value = withCString key $ \k -> withCString value $ \v -> do 
    success <- c_SetEnvironmentVariable k v 
    unless success (throwGetLastError "setEnv") 

putEnv :: String -> IO() 
putEnv v = void (withCString v $ \vv -> c_putenv vv) 

foreign import stdcall unsafe "windows.h SetEnvironmentVariableA" 
    c_SetEnvironmentVariable :: CString -> CString -> IO Bool 

-- SetEnv_ :: String -> String -> IO() 
-- SetEnv_ key value = withCWString key $ \k -> withCWString value $ \v -> do 
-- success <- c_SetEnvironmentVariable k v 
-- unless success (throwGetLastError "setEnv") 
-- 
-- Foreign import stdcall unsafe "windows.h SetEnvironmentVariableW" 
-- c_SetEnvironmentVariable :: LPTSTR -> LPTSTR -> IO Bool 

foreign import ccall unsafe "putenv" c_putenv :: CString -> IO CInt 

जाहिर CPP का उपयोग केवल खिड़कियों के लिए एक #ifdef में पूरी बात डाल करने के लिए। जैसा कि आप देख सकते हैं कि मेरे पास विस्तृत कॉल के लिए कोड है, लेकिन मैंने वर्तमान में टिप्पणी की। मुझे लगता है कि मेरे उपयोग के मामले में यह शायद putenv पर कॉल करने के लिए पर्याप्त होगा, लेकिन यह ठीक है जैसे यह काम करता है। तो यहाँ मैं इसे कैसे तो फोन है:

setEnv_ "LANG" localeStr 
putEnv $ "LANG=" ++ localeStr 

मेरे समस्या यह है कि मैं घर पर मुख्य रूप से एक linux उपयोगकर्ता हूँ और मैं घर पर खिड़कियों पर बहुत ज्यादा काम कर रही है पसंद नहीं है, और मैं एक बहुत डाल इस और अन्य चीजों को विंडोज़ पर ठीक से काम करने के लिए ऊर्जा का, और मैं इसे आगे साफ करने के लिए खुद को नहीं ला सकता हूं। लेकिन इस कोड और मूल पैच के साथ आपको इसे बिना किसी समस्या के बेस < 4.7 पर काम करने के लिए मिलना चाहिए।

3

POSIX प्लेटफार्मों आप System.Posix.Env, एक putEnv समारोह है जो उपयोग कर सकते हैं पर (तो बस export VAR=val को क्रियान्वित करने या System.Posix.Env का उपयोग कर रहा के लिए काफी क्या देख रहा हूँ नहीं है।)। यह export चलाने से अधिक पोर्टेबल है, हालांकि दुर्भाग्यवश वास्तव में क्रॉस-प्लेटफ़ॉर्म नहीं है।

+1

उत्तर के लिए धन्यवाद। मैंने वास्तव में सवाल पोस्ट करने के बाद उस मॉड्यूल को देखा, लेकिन मुझे वास्तव में ऐसा कुछ पसंद आएगा जो विंडोज पर काम करेगा। –

3

एक संकेत है कि यह संभव पार मंच नहीं है कि जावा एपीआई एक putenv नहीं है। यह भी देखें related post

सबसे लगातार उपयोग के मामले के लिए समाधान जब exec आईएनजी कार्यक्रमों एक उचित रूप से निर्माण पर्यावरण पारित करने के लिए है।

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