我正在尝试使用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)
我希望有更好的方法。
谢谢,感谢您的帮助:)
答案 0 :(得分: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._