Вопрос или проблема
Я пытаюсь захватить сеанс оболочки (вывод компиляции программы на C), и терминал показывает предупреждения и выделяет цветом переменные в терминале. Смотрите прикрепленное изображение.
И при захвате typescript сеанса (чтобы отправить вывод кому-то еще для отладки) цвет теперь (как и ожидалось) отображается как управляющие символы терминала. Но это только затрудняет чтение typescript.
Из чтения man-страницы script(1) я вижу, что нет опций для удаления или устранения этого поведения. Есть ли какая-то альтернатива script(1), которая записывала бы только команды и вывод, а не команды, управляющие экраном?
Заранее спасибо — f
[fernan@host] script make.out
Script started, output log file is 'make.out'.
make; exit
Script started on 2025-01-22 14:36:56-03:00 [TERM="xterm-256color" TTY="/dev/pts/1" COLUMNS="209" LINES="52"]
^[[?2004h(base) ^[]0;fernan@rho: ~/phred-phrap-consed/phrap-cross_match-swat^G^[[01;32mfernan@host^[[00m:^[[01;34m~/phred-phrap-consed/phrap-cross_match-swat^[[00m$ make; exit^M
^[[?2004l^Mcc -O2 -c -o swat.o swat.c^M
^[[01m^[[Kswat.c:29:1:^[[m^[[K ^[[01;35m^[[Kwarning: ^[[m^[[Kreturn type defaults to ‘^[[01m^[[Kint^[[m^[[K’ [^[[01;35m^[[K^[]8;;https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html#index-Wimplicit-int^G-Wimplicit-int^[]8;;^G^[[m^[[K]^M
29 | ^[[01;35m^[[Kcompare_scores^[[m^[[K(entry1, entry2)^M
| ^[[01;35m^[[K^~~~~~~~~~~~~~^[[m^[[K^M
^[[01m^[[Kswat.c:35:1:^[[m^[[K ^[[01;35m^[[Kwarning: ^[[m^[[Kreturn type defaults to ‘^[[01m^[[Kint^[[m^[[K’ [^[[01;35m^[[K^[]8;;https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html#index-Wimplicit-int^G-Wimplicit-int^[]8;;^G^[[m^[[K]^M
35 | ^[[01;35m^[[Kcompare_z_scores^[[m^[[K(entry1, entry2)
[...]
truncated for clarity
[...]
exit
Script done.
[fernan@host]
Я предпочитаю asciinema
. Просто работает;
asciinema rec make.cast
# Введите ваши команды
exit
# воспроизвести:
asciinema play make.cast
# просто вывести текст:
asciinema cat make.cast
Результат – это просто JSON файл; существует JavaScript-плеер, который вы можете встроить на сайт, если захотите, или вы можете загрузить свои записи на центральный сервис, где получите ссылку для показа другим.
Однако, это больше похоже на то, что вы действительно хотите нечто более фундаментальное: сохранение вывода команды в файл, а не фактическое запись экрана.
Итак,
make > make.log
делает то, что вы хотите. Если вы хотите видеть вывод на экране, пока он записывается,
make | tee make.log
Ответ или решение
Для решения проблемы записи терминальных сессий, где вывод включает предупреждения, подсвеченные цветом, и другие элементы форматирования, можно использовать несколько подходов и инструментов, которые обеспечат чистый текст без управляющих символов терминала. Ваш запрос касается поиска альтернативных методов к скрипту script(1)
, который по умолчанию захватывает как текст, так и управляющие символы. Ниже рассмотрим несколько альтернативных решений, которые могут помочь в данной ситуации.
Теория
Когда вы работаете в терминале и записываете сессии, часто возникает необходимость сохранить чистый вывод без излишнего форматирования и управляющих символов. Управляющие символы терминала, такие как цветное форматирование, могут создавать помехи и усложнять чтение из текста, предназначенного для анализа или отладки. Одним из способов решения этой задачи является использование инструментов, которые позволяют захватывать и фильтровать вывод команд перед записью в файл. Эти инструменты могут предоставить возможность либо напрямую снимать текстовый вывод, либо удалять управляющие символы после захвата.
Примеры
-
Asciinema: Это инструмент для записи сессий терминала, который сохраняет их в формате JSON. Одним из преимуществ этого формата является возможность захвата только чистого текста без форматирования, а также последующее преобразование в удобный для чтения формат. Для просмотра сессий можно использовать встроенный javascript-плеер или команду
asciinema cat
, которая просто выводит текст без управляющих символов.asciinema rec make.cast # Выполняйте ваши команды exit # Для просмотра в терминале: asciinema cat make.cast
-
Tee: Если вашей задачей является не запись всей сессии терминала, а конкретного вывода команды (например, компиляции), вы можете использовать стандартную утилиту
tee
, которая одновременно выводит данные на экран и записывает их в файл. Это позволяет отфильтровывать управляющие символы на этапе записи, если перенаправить стандартный вывод команды:make | tee make.log
-
AnsiStrip: Включение в ваш процесс простого фильтра, удаляющего ANSI-коды, может быть весьма полезно. Вы можете использовать
sed
или Python-скрипты для удаления таких символов:make 2>&1 | sed 's/\x1b\[[0-9;]*[a-zA-Z]//g' > make.log
Или с использованием Python:
python -c "import sys, re; print(re.sub(r'\x1b\[([0-9]+)(;[0-9]+)*m', '', sys.stdin.read()))" < make.out > clean_make.log
Применение
Для вашего случая, где требуется послать чистый вывод компиляции для отладки, можно рекомендовать использовать комбинацию инструментов make | tee make.log
, обеспечивающего потоковую запись, с дополнительной фильтрацией управляющих символов. Если нужна встроенная поддержка записи и воспроизведения сессий в веб-формате, asciinema
станет идеальным выбором. Он позволяет записывать сценарии, которые затем будут воспроизведены в интерактивной и удобной для просмотра форме.
Заключение
Выбор подходящего инструмента для записи и обработки терминальных сессий зависит от ваших конкретных потребностей: нужно ли передавать только текстовое содержание или важно сохранить интерактивную часть для последующего воспроизведения. Рассмотренные выше подходы и инструменты предоставляют широкий спектр возможностей для эффективной работы с журналами терминала, обеспечивая возможность упростить интеграцию данных для отладки и анализа в совместной рабочей среде.