我可以使用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
并不完全符合我的要求。)
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。正如您所看到的,我已经有了宽字符调用的代码,但目前我已经注释掉了它。我认为对于我的用例,只调用putenv
可能就足够了,但是现在这样也可以工作。那么下面是我如何调用它:
setEnv_ "LANG" localeStr
putEnv $ "LANG=" ++ localeStr
setEnv
。 - Emmanuel Touzery