Have you ever wanted to make sure that a call to a library cannot print anything to
stdout
? The following does this except that it redirects stdout globally and not just across a library call. This should be doable, but I haven't needed it yet.
import GHC.IO.Handle -- yes, it's GHC-specific
import System.IO
main = do
stdout_excl <- hDuplicate stdout
hDuplicateTo stderr stdout -- redirect stdout to stderr
putStrLn "Hello stderr" -- will print to stderr
hPutStrLn stdout_excl "Hello stdout" -- prints to stdout
The above code first creates a new handle to the standard output resource using
hDuplicate
. The call to
hDuplicateTo
redirects any output to the
Haskell handle
stdout
to go to the handle
stderr
. The Haskell handle
stdout_excl
is now our only handle to the standard output resource.
No comments:
Post a Comment