Может ли раскрашенный вывод быть захвачен через перенаправление оболочки? [дубликат]
этот вопрос уже есть ответ здесь:
различные команды 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, как ни странно.