我可以使用System.Environment.getEnv
輕鬆讀取環境變量。但是,System.Environment
沒有任何相應的setEnv
函數(據我所知)。如何以跨平臺的方式設置環境變量?
如何從Haskell程序設置環境變量?我更喜歡跨平臺的解決方案。 (所以才執行export VAR=val
或使用System.Posix.Env
不完全是我要找的。)
我可以使用System.Environment.getEnv
輕鬆讀取環境變量。但是,System.Environment
沒有任何相應的setEnv
函數(據我所知)。如何以跨平臺的方式設置環境變量?
如何從Haskell程序設置環境變量?我更喜歡跨平臺的解決方案。 (所以才執行export VAR=val
或使用System.Posix.Env
不完全是我要找的。)
請注意,基準4.7.0現在在System.Environment
中有一個setEnv
。所以在目前或不遠的將來,它已經被整理出來了。
但是,如果您需要版本< 4.7.0(這是我當前的情況)中的此功能,我還從the commit that adds the feature中提取了使這些工作適用於較舊的基本版本所需的功能。
不過,我認真地失去了在這一個耐心和做的比較難看,但它爲我的作品...
困境的是有3個功能在Windows環境中調用:putenv
,SetEnvironmentVariableA
(ASCII)和SetEnvironmentVariableW
(widechar,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
只適用於Windows。正如你所看到的,我有widechar調用的代碼,但我目前評論它。我認爲對於我的用例來說,只需撥打putenv
就足夠了,但它的工作原樣。因此,這裏是我怎麼稱呼它,然後:
setEnv_ "LANG" localeStr
putEnv $ "LANG=" ++ localeStr
我的問題是,我主要是在家裏的Linux用戶,我不喜歡做在家裏的窗戶太多的工作,我把很多的能量讓這個和其他東西在窗戶上正常工作,我不能讓自己進一步清理這個。但有了這個代碼和原始的補丁,你應該得到這個工作基地< 4.7沒有太大的問題。
。您可以使用System.Posix.Env
,具有putEnv
功能POSIX平臺。這比運行export
更便攜,但不幸的是不是真正的跨平臺。
感謝您的回答。發佈問題後,我確實看到了這個模塊,但我真的很喜歡在Windows上工作的東西。 – 2012-02-14 10:26:36
提示跨平臺無法實現這一點,即Java API沒有putenv
。 另請參閱此related post。
最常見的使用案例的解決方案是在exec
程序中通過適當構建的環境。
請注意,基本4.7.0現在有'setEnv'。 – 2014-06-28 19:39:29
@EmmanuelTouzery:太棒了。你可以把它作爲提高可視性的答案嗎?謝謝。 – 2014-06-29 04:45:28