Haskell 如何以跨平台的方式设置环境变量?
我可以使用Haskell 如何以跨平台的方式设置环境变量?,haskell,cross-platform,environment-variables,Haskell,Cross Platform,Environment Variables,我可以使用System.environment.getEnv轻松读取环境变量。但是,System.Environment没有任何相应的setEnv功能(据我所知) 如何从Haskell程序设置环境变量?我更喜欢跨平台解决方案。(因此,仅仅执行export VAR=val或使用System.Posix.Env并不是我想要的。)在Posix平台上,您可以使用System.Posix.Env,它具有putEnv功能。这比运行export更具可移植性,但不幸的是,它不是真正跨平台的。一个提示是,Java
System.environment.getEnv
轻松读取环境变量。但是,System.Environment
没有任何相应的setEnv
功能(据我所知)
如何从Haskell程序设置环境变量?我更喜欢跨平台解决方案。(因此,仅仅执行
export VAR=val
或使用System.Posix.Env
并不是我想要的。)在Posix平台上,您可以使用System.Posix.Env
,它具有putEnv
功能。这比运行export
更具可移植性,但不幸的是,它不是真正跨平台的。一个提示是,Java API没有putenv
。
另见此
最常见用例的解决方案是在执行程序时传递一个适当构造的环境 注意,base 4.7.0现在在
System.Environment
中有一个setEnv
。因此,无论是在现在还是在不久的将来,它都会得到解决
但是,如果您在版本中需要此功能,请回答。在发布问题后,我实际上看到了该模块,但我真的希望它能在Windows上运行。请注意,base 4.7.0现在有一个
setEnv
@EmmanuelTouzery:Awesome。你能把它作为提高能见度的答案吗?谢谢
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
setEnv_ "LANG" localeStr
putEnv $ "LANG=" ++ localeStr