4

How to using createProcess in haskell redirect stderr into /dev/null ?

2 Answers2

3

Open /dev/null with withFile and set it as std_err in the CreateProcess record:

import System.Process
import System.IO 

main :: IO ()
main = withFile "/dev/null" WriteMode (\handle -> do
    (_,_,_,phandle) <- createProcess (shell "echo foo"){ std_err = UseHandle handle}
    waitForProcess phandle
    return ())

In Windows, you can use the NUL file.

Community
  • 1
  • 1
danidiaz
  • 26,936
  • 4
  • 45
  • 95
2

Not the exact solution you are looking for but one popular solution in the community is to use the silently package to achieve it.

You can use the function hSilence to do want you want. In fact, internally it opens /dev/null and does all the work. Sample code demo:

#!/usr/bin/env stack
{- stack
     --resolver lts-6.15
     --install-ghc
     runghc
     --package process
     --package silently
 -}

import System.Process
import System.IO
import System.IO.Silently

writeToStderr :: IO ()
writeToStderr = do
  hPutStrLn stderr "hello"
  hPutStrLn stderr "world"

main :: IO ()
main = hSilence [stderr] writeToStderr
Sibi
  • 47,472
  • 16
  • 95
  • 163