Bash-скрипт не перехватывает ошибку возврата команды sbt - PullRequest
0 голосов
/ 11 апреля 2019

В нашем скрипте bash мы запускаем команду sbt. Я хочу поймать ошибку в случае, если sbt не удалось, но не могу понять, как это сделать. Я попробовал следующие два подхода после поиска в Google:

Подход 1:

sbt ${assemblyCmd} |tee ${TARGET}/assembly.log 
if [ "$?" -eq 0 ];
then echo "Build jar successfully"
else
    echo "Failed to build jar"
    exit 1
fi

Подход 2

if sbt ${assemblyCmd} |tee ${TARGET}/assembly.log
then echo "Build jar successfully"
else
    echo "Failed to build jar"
    exit 1
fi

Ни один из них не работает. Я вижу, что sbt не удалось с сообщением об ошибке, но bash по-прежнему выводит Build jar successfully:

[0m[[0m[0minfo[0m] [0m[0mCompiling 21 Scala sources to /opt/utility/spark-jobs/target/scala-2.10/classes ...[0m
[0m[[0m[31merror[0m] [0m[0m/opt/utility/spark-jobs/src/main/scala/com/st/spark/jobs/SubAudit.scala:130:3: type mismatch;[0m
[0m[[0m[31merror[0m] [0m[0m found   : Unit[0m
[0m[[0m[31merror[0m] [0m[0m required: org.apache.spark.sql.DataFrame[0m
[0m[[0m[31merror[0m] [0m[0m  }[0m
[0m[[0m[31merror[0m] [0m[0m  ^[0m
[0m[[0m[31merror[0m] [0m[0mone error found[0m
[0m[[0m[31merror[0m] [0m[0m(SparkJobs / Compile / [31mcompileIncremental[0m) Compilation failed[0m
[0m[[0m[31merror[0m] [0m[0mTotal time: 16 s, completed Apr 11, 2019 5:28:26 PM[0m
Build jar successfully

sbt не удалось при компиляции.

Ответы [ 2 ]

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

Вы могли бы рассмотреть возможность записи сообщений журнала в стандартную ошибку вместо стандартного вывода.Затем вы можете направить вывод всего оператора if в tee вместо просто команды sbt.

# You should *probably* quote $assemblyCmd, but there's not
# enough context to know if you are relying on word-splitting.
if sbt $assemblyCmd; then
  echo "Build jar successfully" >&2
else
  echo "Failed to build jar" >&2
  exit 1
fi | tee "$TARGET"/assembly.log
0 голосов
/ 11 апреля 2019

Вы всегда получаете успешный код завершения, потому что команда tee всегда успешна. sbt - это команда, которая возвращает ненулевой код выхода. Для этого случая вы можете использовать переменную $ PIPESTATUS, которую можно использовать для проверки состояния нескольких переданных по конвейеру команд.

sbt ${assemblyCmd} |tee ${TARGET}/assembly.log

if [ "${PIPESTATUS[0]}" -eq 0 ];
    then echo "Build jar successfully"
else
    echo "Failed to build jar"
    exit 1
fi
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...