有没有办法获得早期管道Scala进程(#|)的退出代码?

问题描述 投票:1回答:1

我正在尝试使用scala的sys.process库来管道命令,但我注意到#|将返回最终进程的退出代码。我之前在管道中遇到命令失败,但是最终命令的退出代码为0,因为它没有错误输出。

我想知道scala是否有办法检查/检索管道(#|)中的先前命令是否失败。

import scala.sys.process._
val p1 = ("false" #| "true").run()
assert(p1.exitValue == 1)

Bash有set -o pipefail将传递管道的非零退出代码,但它看起来有点“hacky”:

val p2 = Seq("/bin/bash", "-c", "set -o pipefail && false | true").run()
assert(p2.exitValue == 1)

我希望有更好的方法。

谢谢,我感谢任何帮助:)

scala process pipe exit-code
1个回答
1
投票

!!运算符在非零退出代码上抛出异常,因此也许它可以用于仅在成功时通过#<运算符将一个进程的输出传递给另一个进程的输入流。如果我们像这样定义一个自定义运算符#|<

  implicit class Pipefail[T](p1: T) {
    def #|<(p2: T)(implicit ev: T => ProcessBuilder): ProcessBuilder =
      Try(p1.!!).map(result => (p2 #< new ByteArrayInputStream(result.getBytes))).get
  }

然后我们可以用它来调用它

("false" #|< "true").run

哪个应该扔

java.lang.RuntimeException: Nonzero exit value: 1

同时

("echo Beam Me Up, Scotty" #|< "tr a-z A-Z" #|< "grep -o SCOTTY" ).run

应该输出大写的SCOTTY。这将使用stringToProcess隐式转换,所以记得import scala.sys.process._

© www.soinside.com 2019 - 2024. All rights reserved.