作为一个简单的练习,我尝试使用以下小程序在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”,但仍然不会改变提示。
答案 0 :(得分:1)
这不是一个Haskell问题本身,只是你不能轻易地用任何会改变其父进程环境的语言编写程序。
在您的方案中,提示由PROMPT
环境变量控制,“父进程”是您从中启动Haskell程序的命令提示符(cmd.exe
)。
我建议您更改提示后,不要尝试更改父cmd.exe
进程,而是生成新的cmd.exe
(也包含runCommand
)。您应该等待此过程以waitForProcess
从runCommand
返回的PID结束,否则您的Haskell程序将在子shell仍在运行时退出。
您可能还必须从运行Prompt
命令切换到直接在Haskell进程中实际更改PROMPT
环境变量,因为运行Prompt
命令时实际发生了什么如上所述,启动新的cmd.exe
只是为了运行该命令,因此环境变化立即被丢弃。
您可以使用setenv package编辑环境。