it-swarm.com.ru

Можно ли захватить цветной вывод через перенаправление Shell?

Различные команды bash, которые я использую - причудливые различия, сценарии сборки и т.д., Выдают много цветного вывода.

Когда я перенаправляю этот вывод в файл, а затем cat или less файл, цветизация исчезает - предположительно, в результате перенаправления вывода были удалены цветовые коды, которые сообщают терминалу об изменении цвета.

Есть ли способ получить цветной вывод, в том числе раскрашивание?

69
billc

Одним из способов получения цветного вывода является команда script. Запуск script запустит сеанс bash, где весь необработанный вывод будет записан в файл (по умолчанию TypeScript).

51
ataylor

Перенаправление не снимает цвета, но многие команды обнаружат, когда они отправляют вывод на терминал, и не будут производить цвета по умолчанию, если нет. Например, в Linux ls --color=auto (который во многих местах имеет псевдоним ls) не будет генерировать цветовые коды при выводе в канал или файл, но ls --color будет. Многие другие инструменты имеют аналогичные флаги переопределения, чтобы заставить их сохранять цветной вывод в файл, но все это зависит от отдельного инструмента.

Даже если у вас есть цветовые коды в файле, чтобы увидеть их, вам нужно использовать инструмент, который оставляет их нетронутыми. less имеет флаг -r для отображения данных файла в "сыром" режиме; это отображает цветовые коды. edit: Немного более новые версии также имеют флаг -R, который специально знает о цветовых кодах и отображает их должным образом, с лучшей поддержкой таких вещей, как обтекание/обрезка линий, чем в необработанном режиме, потому что меньше может сказать, какие вещи управляющие коды и которые на самом деле символы идут на экран.

34
Walter Mundt

некоторые программы удаляют окраску, когда понимают, что вывод не является TTY (т.е. когда вы перенаправляете их в другую программу). Вы можете указать некоторым из них принудительно использовать цвет и указать пейджеру включить цветность, например, используйте less -R

10
alvherre

Вдохновленный другими ответами, я начал использовать script. Я должен был использовать -c, чтобы заставить это работать все же. Все остальные ответы, включая tee, разные script примеры, не работали для меня.

Контекст:

  • Ubuntu 16.04
  • запуск тестов поведения с behave и запуск команды Shell во время теста с subprocess.check_call() python

Решение:

script --flush --quiet --return /tmp/ansible-output.txt --command "my-ansible-command"

Пояснения к выключателям:

  • --flush был необходим, потому что в противном случае выходные данные не являются хорошо наблюдаемыми в реальном времени, приходя большими кусками
  • --quiet подавляет собственный вывод инструмента-скрипта
  • -c, --command напрямую предоставляет команду для выполнения, конвейер из моей команды в скрипт не работает для меня (без цветов)
  • --return чтобы скрипт передавал код завершения моей команды, чтобы я знал, что моя команда не выполнена
10
geekQ

Я обнаружил, что использование 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, но он сохраняет цвета, а также продолжает читать новый контент, добавленный в файл (другие методы, которые я пробовал, этого не делают).

8
Joels Elf

Этот вопрос на суперпользователе помогли мне, когда мой другой ответ (включая tee) не работал. Он предполагает использование unbuffer, чтобы заставить команду думать, что она запускается из командной консоли.

Я установил его, используя Sudo apt install expect tcl, а не Sudo apt-get install expect-dev.

Мне нужно было использовать этот метод при перенаправлении вывода apt, по иронии судьбы.

3
Richard Wiseman