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

<p>различные команды bash, которые я использую - причудливые различия, сценарии сборки и т.д., выдают много цветного вывода.</p><p>когда я перенаправляю этот вывод в файл, а затем <code>cat</code> или <code>less</code> файл, цветизация исчезает - предположительно, в результате перенаправления вывода были удалены цветовые коды, которые сообщают терминалу об изменении цвета.</p><p>есть ли способ получить цветной вывод, в том числе раскрашивание?</p>

<p>одним из способов получения цветного вывода является команда <code>script</code>. запуск <code>script</code> запустит сеанс bash, где весь необработанный вывод будет записан в файл (по умолчанию <code>typescript</code>).</p>

<p>перенаправление не снимает цвета, но многие команды обнаружат, когда они отправляют вывод на терминал, и не будут производить цвета по умолчанию, если нет. например, в linux <code>ls --color=auto</code> (который во многих местах имеет псевдоним <code>ls</code>) не будет генерировать цветовые коды при выводе в канал или файл, но <code>ls --color</code> будет. многие другие инструменты имеют аналогичные флаги переопределения, чтобы заставить их сохранять цветной вывод в файл, но все это зависит от отдельного инструмента.</p><p>даже если у вас есть цветовые коды в файле, чтобы увидеть их, вам нужно использовать инструмент, который оставляет их нетронутыми. <code>less</code> имеет флаг <code>-r</code> для отображения данных файла в "сыром" режиме; это отображает цветовые коды. <em>edit:</em> немного более новые версии также имеют флаг -r, который специально знает о цветовых кодах и отображает их должным образом, с лучшей поддержкой таких вещей, как обтекание/обрезка линий, чем в необработанном режиме, потому что меньше может сказать, какие вещи управляющие коды и которые на самом деле символы идут на экран.</p>

<p>некоторые программы удаляют окраску, когда понимают, что вывод не является tty (т.е. когда вы перенаправляете их в другую программу). вы можете указать некоторым из них принудительно использовать цвет и указать пейджеру включить цветность, например, используйте <code>less -r</code></p>

<p>вдохновленный другими ответами, я начал использовать <code>script</code>. я должен был использовать <code>-c</code>, чтобы заставить это работать все же. все остальные ответы, включая <code>tee</code>, разные <code>script</code> примеры, не работали для меня.</p><p>контекст:</p><ul> <li>ubuntu 16.04</li> <li>запуск тестов поведения с <code>behave</code> и запуск команды shell во время теста с <code>subprocess.check\_call()</code> python</li> </ul><p>решение:</p><pre><code>script --flush --quiet --return /tmp/ansible-output.txt --command "my-ansible-command" </code></pre><p>пояснения к выключателям:</p><ul> <li><code>--flush</code> был необходим, потому что в противном случае выходные данные не являются хорошо наблюдаемыми в реальном времени, приходя большими кусками</li> <li><code>--quiet</code> подавляет собственный вывод инструмента-скрипта</li> <li><code>-c, --command</code> напрямую предоставляет команду для выполнения, конвейер из моей команды в скрипт не работает для меня (без цветов)</li> <li><code>--return</code> чтобы скрипт передавал код завершения моей команды, чтобы я знал, что моя команда не выполнена</li> </ul>

<p>я обнаружил, что использование <code>script</code> для сохранения цветов при передаче по трубопроводу на <code>less</code> на самом деле не работает (меньше все испорчено и при выходе, bash все испорчено), потому что меньше интерактивно. <code>script</code>, похоже, действительно испортил ввод, исходящий от <code>stdin</code>, даже после выхода.</p><p>итак, вместо запуска:</p><pre><code>script -q /dev/null cargo build | less -r </code></pre><p>я перенаправляю <code>/dev/null</code> на него перед тем, как отправлять на меньше:</p><pre><code>script -q /dev/null cargo build < /dev/null | less -r </code></pre><p>так что теперь <code>script</code> не связывается с <code>stdin</code> и получает именно то, что я хочу. это эквивалент <code>command | less</code>, но он сохраняет цвета, а также продолжает читать новый контент, добавленный в файл (другие методы, которые я пробовал, этого не делают).</p>

<p> <a href="https://superuser.com/a/751809/280656">этот вопрос</a> на суперпользователе помогли мне, когда мой <a href="https://stackoverflow.com/a/38071740/1999993">другой ответ</a> (включая <code>tee</code>) не работал. он предполагает использование <code>unbuffer</code>, чтобы заставить команду думать, что она запускается из командной консоли.</p><p>я установил его, используя <code>sudo apt install expect tcl</code>, а не <code>sudo apt-get install expect-dev</code>.</p><p>мне нужно было использовать этот метод при перенаправлении вывода <code>apt</code>, по иронии судьбы.</p>