В нашем 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 не удалось при компиляции.

1
user468587 11 Апр 2019 в 21:14

2 ответа

Лучший ответ

Вы можете записать свои сообщения журнала в стандартную ошибку вместо стандартного вывода. Затем вы можете направить вывод всего оператора 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
1
chepner 11 Апр 2019 в 18:53

Вы всегда получаете успешный код завершения, потому что команда 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
0
BlackPearl 11 Апр 2019 в 18:27