2012-02-14 17 views
9

System.Environment.getEnvを使用して環境変数を簡単に読み取ることができます。しかし、System.Environmentには対応する機能はありません(私が知る限り)。プラットフォーム間で環境変数を設定するにはどうすればよいですか?

Haskellプログラムから環境変数を設定するにはどうすればよいですか?私はクロスプラットフォームのソリューションを好むだろう。 (だからexport VAR=valを実行するか、System.Posix.Envを使用すると、私が探しているかなりものではありません。)あなたはputEnv機能を持っているSystem.Posix.Envを、使用することができますPOSIXプラットフォームで

+1

ベース4.7.0に 'setEnv'が追加されました。 –

+0

@EmmanuelTouzery:Awesome。可視性を高めるための答えとしてそれを入れてもいいですか?ありがとう。 –

答えて

3

ここで、ベース4.7.0は、setEnvSystem.Environmentにあることに注意してください。したがって、現在または近い将来、それは整理されます。

< 4.7.0でこの機能が必要な場合(現在のケースです)、私はthe commit that adds the featureから、以前のベースバージョンでこの作業を行うために必要な機能も抽出しました。

私は真剣にこの1に忍耐を失い、それはかなり醜いでしたが、それは私の作品が

...

混乱は、Windows環境で呼び出すための3つの機能があるということです:putenvSetEnvironmentVariableA(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 

Windowsのみ#ifdefに全部を入れてCPPを使用しています。あなたが見ることができるように、私はwidechar呼び出しのコードを持っていますが、私はそれを現在コメントしています。私は私の使用ケースではおそらくちょうどputenvを呼ぶだけで十分だろうと思うが、うまく動作する。だからここに私はそれを呼び出す方法は次のとおりです。

setEnv_ "LANG" localeStr 
putEnv $ "LANG=" ++ localeStr 

私の問題は、私は主に自宅でLinuxのユーザーだと私は自宅でWindows上であまりにも多くの仕事をやって好きではない、と私は多くを置くということです窓の上でこれと他のものが適切に機能するようにするためのエネルギーが必要です。これをさらに清掃することはできません。しかし、このコードとオリジナルのパッチでは、これは基本的に< 4.7で動作するはずです。

3

。残念ながらクロスプラットフォームではありませんが、それはexportを実行するより移植性があります。

+1

答えをありがとう。私は質問を投稿した後に実際にそのモジュールを見ましたが、私はWindows上で動作するものが本当に好きです。 –

3

これはクロスプラットフォームではあり得ないというヒントとして、Java APIにはputenvがありません。 も参照してくださいrelated post

exec-プログラムの場合、適切な構成の環境を最も頻繁に使用する解決策があります。

関連する問題