Почему в сохранённом терминальном выводе через script или watch появляются странные символы и как это исправить?

Как правильно сохранять вывод команд в текстовый файл: решение проблем с управляющими последовательностями

При работе с Linux и Unix-подобными системами часто возникает необходимость сохранить вывод команд в текстовый файл для дальнейшего анализа или хранения. Однако при использовании таких утилит, как script или watch, содержимое сохраняемого файла может выглядеть «странно» и содержать непонятные символы. В этой статье мы разберём, почему так происходит и как можно сохранить вывод команд в читаемом виде.

Почему в файле с выводом команд появляются «странные» символы?

Когда вы запускаете команду вроде:

bash
watch date | tee a.txt

или

bash
script a.txt …

вы пытаетесь сохранить вывод программы в файл. Однако, терминал — это не просто поток текста. Все символы от программы передаются по одному потоку, и в нём встречаются не только печатные символы, но и управляющие последовательности: команды для перемещения курсора, очистки экрана, установки цвета текста и другие. Эти управляющие символы необходимы для корректного отображения информации в терминале, но в обычном текстовом редакторе они выглядят как непонятные «кракозябры».

Почему watch и script ведут себя именно так?

Утилита watch предназначена для постоянного вывода обновляющейся информации — она специально использует управляющие последовательности для обновления экрана терминала. При выводе в файл или по конвейеру она не меняет своего поведения, поэтому в файл попадают и управляющие символы.

Утилита script работает иначе: она создаёт виртуальный терминал (pty), через который перехватывает вывод дочерних процессов, заставляя их думать, что они выводят информацию в реальный терминал. Таким образом, script может сохранить весь вывод, включая управляющие последовательности, что полезно для записи интерактивных сессий.

Как сделать сохранённый файл читаемым?

Поскольку управляющие последовательности находятся в одном потоке с текстом, отделить их «по-умному» нельзя. Но существуют способы «очистить» вывод:

  1. Удаление управляющих символов с помощью утилит. Например, команда col -b удаляет управляющие символы возврата каретки:

    bash
    watch date | col -b > output.txt

  2. Использование специальных фильтров и скриптов для удаления или замены escape-последовательностей (например, sed, perl или ansi2txt).

  3. Запись с помощью script с опцией --log-timing и последующий просмотр записи через scriptreplay. Это особенно полезно, если нужно записать интерактивную сессию:

    bash
    script —log-timing script.tm —log-out script.out —command ‘timeout 10 watch date’
    scriptreplay —log-timing script.tm —log-out script.out —maxdelay 0.8

    Здесь script сохраняет вывод с временными метками, а scriptreplay позволяет воспроизвести сессию в терминале, корректно обрабатывая управляющие последовательности.

Выводы и рекомендации

Сохранение вывода программ, рассчитанных на работу с терминалом, в простом текстовом виде всегда связано с проблемой «лишних» управляющих символов. Это нормальное явление, так как терминал использует эти символы для форматирования вывода.

Чтобы получить читаемый текст, необходимо фильтровать файлы с выводом или пользоваться специализированными инструментами для обработки escape-последовательностей. В некоторых случаях удобнее сохранять и воспроизводить сессии с помощью script и scriptreplay.

Если вам нужно просто сохранить текст без форматирования, используйте утилиты вроде col -b. Если важна интерактивность и сохранение внешнего вида — воспользуйтесь script с таймингами и последующим воспроизведением.

Таким образом вы сможете избежать путаницы с непонятными символами в сохранённых файлах и эффективно работать с выводом команд Linux.

Источник

Ответить

Ваш адрес email не будет опубликован. Обязательные поля помечены *