Как сохранить содержимое терминала GNOME с помощью управляющих кодов ANSI?

9

Терминалы VT100 имеют относительно простой способ сохранить терминальное содержимое с помощью эвакуационных кодов в файл с помощью Meta- p:

XTerm.VT100.printAttributes: 2
XTerm.VT100.printerCommand: cat - > file
XTerm.VT100.translations: #override Meta <KeyPress> P: print() \n

Я немного осмотрелся и не могу найти решение, чтобы это работало в терминале GNOME по умолчанию + XTerm + Bash.

Я не хочу просто изображение с содержимым окна.

Похоже, что GNOME Terminal может в конечном итоге получить исправление для этого , но нет никакой информации о том, в какую версию он будет включен, и прошло почти три года с момента последнего обновления ...

l0b0
источник
К сожалению, просто нет способа сделать это. См: askubuntu.com/q/20739
Zaz
@ Джош, я не думаю, что это тот же вопрос. Я не хочу сохранять весь вывод команды, а скорее весь видимый вывод в окне терминала.
10

Ответы:

3

К сожалению, l0b0 ответ из коробки: это невозможно.

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

Терминал Gnome Terminal Source

Версия в Raring 3.6.1, так что вы можете посмотреть на этот источник. Внутри Terminal-window.c по строке 115:

/*
 * We don't want to enable content saving until vte supports it async.
 * So we disable this code for stable versions.
 */

#include "terminal-version.h"

#if (TERMINAL_MINOR_VERSION & 1) != 0
#define ENABLE_SAVE
#else
#undef ENABLE_SAVE
#endif
#endif

Опции:

  1. Добавьте #define ENABLE_SAVE под этим.
  2. Измените версию на нестабильную.
  3. Загрузите нестабильную версию .DEB.

Надеюсь это поможет.

LimpingNinja
источник
Сохраняет ли это управляющие клавиши ANSI или только текст?
10
Я подтвердил, и vte_terminal_write_contents (), по-видимому, не записывает коды ANSI, на данный момент мой первоначальный ответ является наиболее точным: «То, что вы хотите, невозможно (из коробки)». Если вы ориентированы на разработчиков, вы, вероятно, можете переписать функцию в termainal-window.c 3340 save_contents_dialog_on_response (...) Примерно в строке 3372 вы увидите, где сделан вызов vte_terminal_write_contents. Я не собираюсь идти дальше, поскольку это выходит за рамки этого сайта. Другие терминалы предлагают это гораздо дешевле, чем перекомпилируют ваши утилиты.
LimpingNinja
+100. Если возможно, я бы разделил это между этим и вашим другим ответом, так как они оба делают 90% того, что я хочу.
10
3

К сожалению, l0b0 ответ из коробки: это невозможно.

Есть два способа исправить это: постоянно запускать скрипт на своем терминале и регистрировать весь вывод. Откройте gnome-терминал, перейдите в « Правка» -> « Настройки профиля» , затем вкладку « Заголовок и команда» и для вашей пользовательской команды используйте это:

bash -l -c 'script -q -c bash $HOME/sessionlogs/$BASHPID.sessionlog.$(date +%Y%m%d-%H%M).txt'

Убедитесь, что сессионные журналы существуют в $ HOME.

Другой способ был удален и добавлен в качестве второго ответа на этот вопрос.

LimpingNinja
источник
Действительно, исправил ответ, чтобы исправить опечатку, произошедшую во время перестройки. Я также выделяю вариант «перекомпилировать», так как я согласен, что они не связаны между собой.
LimpingNinja
less -rна самом деле показывает вывод в печатном виде - спасибо!
10
0

Вы можете запустить свои оболочки через скрипт (1), чтобы получить весь ввод и вывод терминала, сохраненный в файле, включая экранирование терминала.

geirha
источник
1
Это другой вариант использования. scriptне может быть использован для сохранения контента после факта, и он не просто сохраняет видимый вывод .
10
1
Ты уверен? Правда, он не может сохранить сценарии после факта, но когда я проверил это и вывел некоторые разрешения на файлы, llон сохранил весь вывод.
Мэтт
0

Есть пакет, который называется screen - терминальный мультиплексор с эмуляцией терминала VT100 / ANSI.

Согласно man-странице экрана на веб-сайте Руководств по Ubuntu , экран утверждает, что

полноэкранный диспетчер окон, который мультиплексирует физический терминал между несколькими процессами (обычно это интерактивные оболочки). Каждый виртуальный терминал обеспечивает функции терминала DEC VT100 и, кроме того, несколько функций управления из ISO 6429 (ECMA 48, ANSI X3. 64) и стандартами ISO 2022 (например, вставить / удалить строку и поддержку нескольких наборов символов) терминальный мультиплексор с эмуляцией терминала VT100 / ANSI '.

а при запуске экрана :

Ctrl ah (печатная копия) Записать печатную копию текущего окна в файл "hardcopy.n".

Я попробовал в терминале GNOME, запустив screenи набравCtrl ah

бегущий экран и набрав Ctrl Alt h

Это вывод моего файла hardcopy.1 при открытии в Gedit:

hardcopy.1 открыт в Gedit

Вы можете найти экран в хранилище программного обеспечения raring / main в Ubuntu 13.04.

Он не установлен по умолчанию.


источник
-1

Хм, это не будет копировать escape-коды, а просто чтобы захватить текст, вы можете перейти в меню Edit -> Select All, затем нажать CtrlShiftCи либо (i) вставить буфер обмена в редактор, либо (ii) набрать cat > filenameи нажать CtrlShiftV.

январь
источник
Это другой вариант использования - как указано, я хочу включить управляющие коды ANSI.
10
-1

man history ищите расширение истории для сбежавших персонажей. Я верю, что history могу сделать то, что ты просишь.

j0h
источник
Я не мог найти ничего релевантного на manстранице. Пожалуйста, будьте более конкретны.
10