如何在Haskell中组合Handles?

acf*_*zer 15 io haskell subprocess

我想有一些像bash的2>&1哈斯克尔结合重定向stdoutstderr从过程到一个单一的Handle.使用System.Process.createProcess或类似的库函数直接执行此操作会很好,特别是如果它使用与来自句柄的bash重定向wrt交错输入相同的语义.

createProcess最初提供的灵活性似乎很有希望:可以指定Handle用于标准文件描述符的a,因此Handle可以同时给出stdoutstderr.但是,Handle参数必须在调用之前已经存在.如果没有能力Handle在调用函数之前创建一个稀薄的空气,我不确定问题是否可以通过这种方式解决.

编辑:无论平台如何,解决方案都需要工作.

nh2*_*nh2 4

这里

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
Run Code Online (Sandbox Code Playgroud)