Получение статуса завершения вложенной команды внутри перенаправления, прикрепленного к тройнику

У меня есть эта команда:

coverage report | tee >(grep TOTAL | awk '{exit (int($4) >= 75)?0:1}') && (exit ${PIPESTATUS[0]})

который сообщает о покрытии кода, а затем печатает вывод stdout и перенаправляет этот же вывод в grep + awk, который в основном проверяет, покрывает ли покрытие кода меньше или больше, чем 75, Наконец, есть exit в подоболочке, которую я притворяюсь использовать в моем конвейере CI/CD.

Проблема в том, что мой CI/CD всегда завершается успешно, что не должно происходить, поскольку охват кода в моих тестах составляет менее 75%. Это означает, что PIEPSTATUS не возвращает то, что я ожидаю, что он вернется exit код).

В чем проблема? Что я делаю неправильно?

1 ответ

Решение

Выход из статуса

command | tee >(...)

будет статус выхода teeнезависимо от того, что происходит внутри процесса подстановки >(...), Вот почему ваш код не работает.

Вы можете достичь своей цели без использования процесса подстановки, например так:

coverage report | awk '{print} /TOTAL/ { pcnt=$4 } END {exit (int(pcnt) >= 75) ? 0 : 1}')
  • {print} печатает все строки
  • /TOTAL/ ... захватывает процент и сохраняет его в pcnt
  • END ... выходит из кода на основе pcnt

Это не только напечатает все строки, испускаемые coverage report, он также должен был бы убедиться, что код выхода конвейера отражает логику процента покрытия.

Другие вопросы по тегам