Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

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

Ответ 3

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

Ответ 4

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

Ответ 5

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

Context:

  • Ubuntu 16.04
  • выполнение тестов поведения с помощью 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 распространение кода выхода моей команды, поэтому я знаю, что моя команда потерпила неудачу

Ответ 6

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

Я установил его с помощью sudo apt install expect tcl, а не sudo apt-get install expect-dev.

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

Ответ 7

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

command | tee filename > /dev/null