Может ли раскрашенный вывод быть захвачен через перенаправление оболочки? [дубликат]


этот вопрос уже есть ответ здесь:

различные команды bash, которые я использую -- fancy diffs, build scripts и т. д., производят много цветового вывода.

когда я перенаправить этот вывод в файл, а потом cat или less файл позже, раскрашивание исчезло-предположительно B / c акт перенаправления вывода лишен цветовых кодов, которые говорят терминалу изменить цвета.

есть ли способ захватить раскрашенный вывод, включая раскрашивание?

7 55

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 и запуск команды оболочки во время теста с помощью python subprocess.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, как ни странно.

я использую tee: передайте выходные данные команды в teefilename и он будет держать цвет. И если вы не хотите видеть вывод на экране (что такое tee для: показывать и перенаправлять вывод одновременно) затем просто отправьте вывод tee до /dev/null:

command| teefilename> /dev/null