Windows中的Haskell runCommand

时间:2014-01-01 02:56:09

标签: windows haskell

作为一个简单的练习,我尝试使用以下小程序在Win7的命令提示符窗口中更改提示:

module Main where
 import System.Environment
 import System.Process 

 p :: String -> String 
 p name = "Prompt " ++ name ++ "\r\n"

 main :: IO ()
 main = do
     putStrLn ("Give me a name:")
     name <- getLine
     putStrLn (p name)
     pid <- runCommand $ p name

虽然它在命令提示符窗口中运行正常,但实际上并不会更改提示。手动在命令行上输入相同的命令会更改它。当我使用“system”(返回退出代码)而不是“runCommand”(它只返回一个pid)时,它会给出“ExitSuccess”,但仍然不会改变提示。

1 个答案:

答案 0 :(得分:1)

这不是一个Haskell问题本身,只是你不能轻易地用任何会改变其父进程环境的语言编写程序。

在您的方案中,提示由PROMPT环境变量控制,“父进程”是您从中启动Haskell程序的命令提示符(cmd.exe)。

我建议您更改提示后,不要尝试更改父cmd.exe进程,而是生成新的cmd.exe(也包含runCommand)。您应该等待此过程以waitForProcessrunCommand返回的PID结束,否则您的Haskell程序将在子shell仍在运行时退出。

您可能还必须从运行Prompt命令切换到直接在Haskell进程中实际更改PROMPT环境变量,因为运行Prompt命令时实际发生了什么如上所述,启动新的cmd.exe只是为了运行该命令,因此环境变化立即被丢弃。

您可以使用setenv package编辑环境。