在scala中抓取进程stderr

Omr*_*dan 16 scala process stderr

使用scala 2.9 process API时,我可以做类似的事情

"ls -l"!
Run Code Online (Sandbox Code Playgroud)

这将把进程stdout和stderr发送到我自己的进程中.要么:

val output = "ls -1"!!
Run Code Online (Sandbox Code Playgroud)

这会将发送到stdout的内容返回到val输出中.

我怎么能同样抓住stderr?

eiv*_*ndw 39

您可以创建自己的ProcessLogger:

import sys.process._

val logger = ProcessLogger(
    (o: String) => println("out " + o),
    (e: String) => println("err " + e))

scala> "ls" ! logger
out bin
out doc
out lib
out meta
out misc
out src
res15: Int = 0

scala> "ls -e" ! logger
err ls: invalid option -- e
err Try `ls --help' for more information.
res16: Int = 2
Run Code Online (Sandbox Code Playgroud)

编辑:上一个示例只是打印,但它可以轻松地将输出存储在某个结构中:

val out = new StringBuilder
val err = new StringBuilder

val logger = ProcessLogger(
    (o: String) => out.append(o),
    (e: String) => err.append(e))

scala> "ls" ! logger
res22: Int = 0

scala> out
res23: StringBuilder = bindoclibmetamiscsrc

scala> "ls -e" ! logger
res27: Int = 2

scala> out
res28: StringBuilder =

scala> err
res29: StringBuilder = ls: invalid option -- eTry `ls --help' for more information.
Run Code Online (Sandbox Code Playgroud)

  • 对此进行编码的最快方法是内联实例化 ProcessLogger 并让它知道该命令作为闭包(在将命令抓取到变量中之后,如 @sscarduzio 提到的)。例如“ls -e”!ProcessLogger((e: String) => println(commandName + " 错误: " + e)` (2认同)