Распечатайте вывод в реальном времени и сохраните его в переменной одновременно
Я знаю, что могу сохранить вывод в переменную, а затем распечатать его:
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
Режим.