Ответ 1
Один способ захвата раскрашенного вывода - с помощью команды script
. Запуск script
запустит сеанс bash, где весь необработанный вывод будет записан в файл (по умолчанию он называется typescript
).
Различные команды bash, которые я использую - fancy diffs, build scripts и т.д., производят много цветового вывода.
Когда я перенаправляю этот вывод в файл, а затем cat
или less
файл позже, раскраска исчезнет - предположительно b/c акт перенаправления вывода удалил цветовые коды, указывающие на терминал для изменения цветов.
Есть ли способ захватить раскрашенный вывод, включая раскраску?
Один способ захвата раскрашенного вывода - с помощью команды script
. Запуск script
запустит сеанс bash, где весь необработанный вывод будет записан в файл (по умолчанию он называется typescript
).
Перенаправление не разбивает цвета, но многие команды обнаруживают, когда они отправляют вывод на терминал, и не будут создавать цвета по умолчанию, если нет. Например, в Linux ls --color=auto
(который во многих местах сглажен до простого ls
) не будет выводиться цветовые коды, если выводится в канал или файл, но ls --color
будет. Многие другие инструменты имеют аналогичные флаги переопределения, чтобы заставить их сохранять раскрашенный вывод в файл, но все это зависит от конкретного инструмента.
Даже если у вас есть цветовые коды в файле, чтобы увидеть их, вам нужно использовать инструмент, который оставит их неповрежденными. less
имеет флаг -r
для отображения данных файла в "сыром" режиме; это отображает цветовые коды. edit: В немного более новых версиях также есть флаг -R, который специально осведомлен о цветовых кодах и отображает их правильно, с лучшей поддержкой таких вещей, как обертывание/обрезка строк, чем режим raw, потому что меньше можно сказать, какие вещи являются управляющими кодами и которые на самом деле являются символами переход на экран.
некоторые программы удаляют раскраску, когда они понимают, что вывод не является TTY (т.е. когда вы перенаправляете их в другую программу). Вы можете сказать некоторым из тех, кто использует цвет, и сообщить пейджеру о включении раскраски, например, используйте less -R
Я обнаружил, что использование script
для сохранения цветов, когда конвейер на less
на самом деле не работает (меньше всего запутано и при выходе, bash все испорчено), потому что меньше интерактивно. script
кажется, действительно испортил ввод, поступающий от stdin
даже после выхода.
Итак, вместо запуска:
script -q /dev/null cargo build | less -R
Я перенаправляю /dev/null
к нему до того, как конвейер будет меньше:
script -q /dev/null cargo build < /dev/null | less -R
Итак, теперь script
не возится с stdin
и получает именно то, что я хочу. Это эквивалент command | less
, но он сохраняет цвета, а также продолжает читать новое содержимое, добавленное к файлу (другие методы, которые я пытался, не сделали бы этого).
Вдохновленный другими ответами, я начал использовать script
. Я должен был использовать -c
, чтобы заставить его работать. Все другие ответы, включая tee
, разные script
примеры не работали для меня.
Context:
behave
и запуск команды оболочки во время теста с помощью python subprocess.check_call()
Решение:
script --flush --quiet --return /tmp/ansible-output.txt --command "my-ansible-command"
Объяснение для коммутаторов:
--flush
был необходим, потому что в противном случае вывод не очень хорошо просматривается, входя в большие куски--quiet
подавляет собственный вывод средства script-c, --command
напрямую предоставляет команду для выполнения, от моей команды до script не работает (без цветов)--return
, чтобы сделать script распространение кода выхода моей команды, поэтому я знаю, что моя команда потерпила неудачу Этот вопрос над суперпользователем помог мне, когда мой другой ответ (с участием tee
) didn ' т работы. Он включает в себя использование unbuffer
, чтобы команда считала его запущенным из оболочки.
Я установил его с помощью sudo apt install expect tcl
, а не sudo apt-get install expect-dev
.
Мне нужно было использовать этот метод, когда иронически перенаправлял вывод apt
.
Я использую tee
: вывести вывод команды в tee
filename
, и он сохранит цвет. И если вы не хотите видеть вывод на экране (что означает tee
для: одновременного отображения и перенаправления вывода), просто отправьте вывод tee
на /dev/null
:
command
| tee
filename
> /dev/null