Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 如何以跨平台的方式设置环境变量?_Haskell_Cross Platform_Environment Variables - Fatal编程技术网

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