【发布时间】:2019-11-20 15:11:28
【问题描述】:
这应该是一个简单的问题,但到目前为止我还没有找到任何直接的答案:如何使用 process 忽略 Haskell 进程的 stderr(或 stdout)图书馆?例如,假设我有以下内容:
let proc = (shell "dir /z") {
std_in = UseHandle stdin
, std_out = CreatePipe
}
(_, out, _, rProc) <- createProcess Proc
exitCode <- waitForProcess rProc
(旁注:在 Windows 中,我知道dir 没有/z 开关。这就是我选择它的原因——所以我可以在stderr 上得到一些有趣的输出。)
这样做只会将stderr 打印到控制台。现在假设我想忽略stderr。我该怎么做?
我发现的唯一线索是在process 文档的this part 中:
NoStream关闭流的文件描述符而不传递句柄。在 POSIX 系统上,这可能会导致子进程出现奇怪的行为,因为在文件关闭后尝试读取或写入会引发错误。这应该只用于根本不使用文件描述符的子进程。如果您希望忽略子进程的输出,您应该创建一个管道并手动将其排空,或者传递一个写入/dev/null的Handle。
这有点帮助,但仍有一些问题没有得到解答。在非 POSIX 系统上,NoStream 可以使用吗?它指的是创建一个管道然后排空它,但我找不到任何有关如何执行此操作的信息? /dev/null 在 Windows 上是 NUL,除非你使用 MSYS 或 Cygwin,当它再次是 /dev/null 时(我认为)——所以我想避免这种情况。
所以重申我的问题:什么是推荐的、与操作系统无关的方法来忽略进程的stderr?
【问题讨论】: