Может ли раскрашенный вывод быть захвачен через перенаправление оболочки? [дубликат]
этот вопрос уже есть ответ здесь:
различные команды bash, которые я использую -- fancy diffs, build scripts и т. д., производят много цветового вывода.
когда я перенаправить этот вывод в файл, а потом cat
или less
файл позже, раскрашивание исчезло-предположительно B / c акт перенаправления вывода лишен цветовых кодов, которые говорят терминалу изменить цвета.
есть ли способ захватить раскрашенный вывод, включая раскрашивание?
7 ответов:
один из способов захвата раскрашенного вывода-это . Работает
script
начнется сеанс bash, в котором все исходные данные будут записаны в файл (с именемtypescript
по умолчанию).
перенаправление не удаляет цвета, но многие команды обнаружат, когда они отправляют вывод на терминал, и не будут создавать цвета по умолчанию, если нет. Например, на Linux
ls --color=auto
(который имеет псевдоним равнинаls
во многих местах) не будет производить цветовые коды при выводе в трубу или файл, ноls --color
будет. Многие другие инструменты имеют аналогичные флаги переопределения, чтобы заставить их сохранять раскрашенные выходные данные в файл, но все это относится к отдельному инструменту.даже если у вас есть цветовые коды в файл, чтобы увидеть их, вам нужно использовать инструмент, который оставляет их нетронутыми.
less
есть-r
флаг для отображения данных файла в режиме" raw"; это отображает цветовые коды. edit: немного более новые версии также имеют флаг a-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
примеры не работают для меня.контекст:
- Ubuntu 16.04
- запуск тестов поведения с
behave
и запуск команды оболочки во время теста с помощью pythonsubprocess.check_call()
устранение:
script --flush --quiet --return /tmp/ansible-output.txt --command "my-ansible-command"
объяснение переключатели:
--flush
было необходимо, потому что в противном случае выход не очень хорошо жив-наблюдаем, приходя в больших кусках--quiet
подавляет собственный вывод инструмента-скрипта-c, --command
непосредственно предоставляет команду для выполнения, конвейер из моей команды в скрипт не работает для меня (без цветов)--return
чтобы скрипт распространял код выхода моей команды, чтобы я знал, если моя команда не удалась
этот вопрос над суперпользователем помог мне, когда мой другого ответа (включая
tee
) не работает. Он включает в себя использованиеunbuffer
чтобы заставить команду думать, что она работает из оболочки.я установил его с помощью
sudo apt install expect tcl
, а неsudo apt-get install expect-dev
.мне нужно, чтобы использовать этот метод при перенаправлении вывода
apt
, как ни странно.