我可以使用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