Есть ли способ получить код завершения ранее переданного процесса Scala (# |)? - PullRequest
1 голос
/ 18 апреля 2019

Я пытаюсь передать команды, используя библиотеку scala sys.process, но заметил, что #| вернет код завершения финального процесса.У меня есть команды ранее в сбое канала, но код завершения последней команды равен 0, поскольку она не выдает ошибку.

Мне было интересно, есть ли у scala способ проверить / получить, если предыдущие командыв канале (# |) не удалось.

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

Bash имеет set -o pipefail, который передаст ненулевой код выхода канала, но это только кажется немного "хакерским":

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

Я надеялся, что может быть лучше.

Спасибо, я ценю любую помощь:)

1 Ответ

1 голос
/ 19 апреля 2019

!! оператор генерирует исключение для ненулевого кода выхода, поэтому, возможно, его можно использовать для передачи вывода одного процесса во входной поток другого через #< Оператор только в случае успеха. Если мы определим пользовательский оператор #|<, например,

  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._

...