作为一个简单的练习,我尝试使用以下小程序更改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",但仍然不会更改提示。
发布于 2014-01-01 11:06:21
这不是Haskell本身的问题,只是你不能轻易地用任何语言编写程序来改变其父进程的环境。
在您的场景中,提示符由Haskell环境变量控制,“父进程”是启动PROMPT程序的命令提示符(cmd.exe)。
我建议您在更改提示符之后生成一个新的cmd.exe (也使用runCommand),而不是尝试更改父cmd.exe进程。您应该等待这个进程完成,从runCommand返回PID为waitForProcess,否则您的Haskell程序将退出,而子shell仍在运行。
您可能还必须从运行Prompt命令切换到直接在您的Haskell进程中实际更改PROMPT环境变量,因为当您像上面那样运行Prompt命令时,实际发生的情况是启动一个新的cmd.exe来运行该命令,因此环境更改会立即被丢弃。
您可以使用setenv package编辑环境。
https://stackoverflow.com/questions/20865166
复制相似问题