Распечатайте вывод в реальном времени и сохраните его в переменной одновременно

Я знаю, что могу сохранить вывод в переменную, а затем распечатать его:

VAR=$(command)
echo "$VAR"

Но это имеет ряд недостатков:

  • Я не буду видеть прогресс команды как она идет.
    • В частности, увидим все stdout выход в конце концов stderr выходной, что затрудняет их соответствие.
  • Так как это приведет к отсутствию вывода в течение всей работы команды, в некоторых средах (например, Travis CI) это завершит работу, если команда работает достаточно долго.

Итак, как я могу сохранить вывод, а также увидеть его вживую на консоли?

  • Портативные решения предпочтительнее, хотя подойдет только Linux/MacOS.
  • Решение не должно иметь нежелательных побочных эффектов в errexit Режим

2 ответа

Решение

От макушки головы можно tee вывод к дополнительному дескриптору файла, установленному в исходный стандартный вывод:

exec 3>&1
VAR=$(command | tee /dev/fd/3)

Нужно иметь set -o pipefail установить для обнаружения commandошибка в errexit Режим.

Это также будет работать

      VAR=$(command | tee /dev/tty)
Другие вопросы по тегам