Я пишу программу, которая запускает внешний подпроцесс в интерактивном режиме, и мне нужно, чтобы содержимое дескриптора вывода было выведено на стандартный вывод, как только он станет доступен. Я пробовал что-то вроде этого:
main = do processInfo <- createProcess (proc "ghci" []){std_out = CreatePipe,
std_in = CreatePipe }
case processInfo of
(Just hIn, Just hOut, _, _) -> do mainloop hIn hOut
hClose hIn
hClose hOut
_ -> do error "Unable to start process"
mainloop :: Handle -> Handle -> IO ()
mainloop inh outh =
do ineof <- hIsEOF outh
if ineof
then return ()
else do inpStr <- hGetLine outh
putStrLn inpStr
mainloop inh outh
Но это не работает, так как он распознает выходные данные только построчно, поэтому любой вывод на дескрипторе вывода процессов, который не завершается переводом строки, не отображается. Я пробовал то же самое с hGetContents, но он дает тот же результат. Я прочитал документацию как System.Process, так и System.IO и не нашел ничего убедительного.