我不确定问题出在哪里,所以我不确定标题是否真正准确。我想要打开一个 shell 进程,并且写入内容然后读取输出:
import System.IO (hPutStr, hGetContents, hSetBuffering, hClose,
BufferMode(NoBuffering))
import System.Process (runInteractiveProcess)
main = do
(hIn, hOut, _, _) <- runInteractiveProcess
"/bin/sh" [] Nothing Nothing
hSetBuffering hIn NoBuffering
hPutStr hIn "ls /\n"
hGetContents hOut >>= putStrLn
hClose hIn
hClose hOut
这似乎可以(有点)有效:
$ ./mwe
bin
boot
cdrom
dev
etc
...
问题是,程序一直卡住(需要用Ctrl-C强制终止)。我想 shell 仍在运行,这阻止了 Haskell 程序的退出。所以我尝试使用
terminateProcess
明确终止 shell:main = do
(hIn, hOut, _, sh) <- runInteractiveProcess
"/bin/sh" [] Nothing Nothing
hSetBuffering hIn NoBuffering
hPutStr hIn "ls /\n"
hGetContents hOut >>= putStrLn
terminateProcess sh
hClose hIn
hClose hOut
但无济于事。我还尝试向 shell 发送 exit
命令:
...
hGetContents hOut >>= putStrLn
hPutStr hIn "exit\n"
...
这也不起作用。
我确定解决方案非常简单,但我找不到它(尝试搜索“haskell kill process”等,但也许问题不是我认为的那样)。如果已经有人提出了这个问题,请提前道歉。非常感谢您的帮助!
ls
输出在哪里结束,提示符从哪里开始。原则上,你可以解析输出并检测提示符,但这非常困难且容易出错。最好以这样的方式组织它,即只运行一个命令,首先读取所有输入,然后生成所有输出,并且不需要在其输出中间输入任何内容。你使用的语言是无关紧要的。 - n. m."ls\nexit\n"
,然后读取输出。但是直接在没有 shell 的情况下执行ls
更容易。 - n. m.