Как правильно сохранять вывод команд в текстовый файл: решение проблем с управляющими последовательностями
При работе с Linux и Unix-подобными системами часто возникает необходимость сохранить вывод команд в текстовый файл для дальнейшего анализа или хранения. Однако при использовании таких утилит, как script
или watch
, содержимое сохраняемого файла может выглядеть «странно» и содержать непонятные символы. В этой статье мы разберём, почему так происходит и как можно сохранить вывод команд в читаемом виде.
Почему в файле с выводом команд появляются «странные» символы?
Когда вы запускаете команду вроде:
bash
watch date | tee a.txt
или
bash
script a.txt …
вы пытаетесь сохранить вывод программы в файл. Однако, терминал — это не просто поток текста. Все символы от программы передаются по одному потоку, и в нём встречаются не только печатные символы, но и управляющие последовательности: команды для перемещения курсора, очистки экрана, установки цвета текста и другие. Эти управляющие символы необходимы для корректного отображения информации в терминале, но в обычном текстовом редакторе они выглядят как непонятные «кракозябры».
Почему watch
и script
ведут себя именно так?
Утилита watch
предназначена для постоянного вывода обновляющейся информации — она специально использует управляющие последовательности для обновления экрана терминала. При выводе в файл или по конвейеру она не меняет своего поведения, поэтому в файл попадают и управляющие символы.
Утилита script
работает иначе: она создаёт виртуальный терминал (pty), через который перехватывает вывод дочерних процессов, заставляя их думать, что они выводят информацию в реальный терминал. Таким образом, script
может сохранить весь вывод, включая управляющие последовательности, что полезно для записи интерактивных сессий.
Как сделать сохранённый файл читаемым?
Поскольку управляющие последовательности находятся в одном потоке с текстом, отделить их «по-умному» нельзя. Но существуют способы «очистить» вывод:
-
Удаление управляющих символов с помощью утилит. Например, команда
col -b
удаляет управляющие символы возврата каретки:bash
watch date | col -b > output.txt -
Использование специальных фильтров и скриптов для удаления или замены escape-последовательностей (например,
sed
,perl
илиansi2txt
). -
Запись с помощью
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.