igor@155: igor@155: igor@155: l3text (или l3) это программа, которая предоставляет интерфейс igor@155: к информации, записанной LiLaLo, прямо в командной строке. igor@155: igor@155: Результаты распознавания записываются с помощью l3-agent igor@155: в базу данных SQLite, и они становятся сразу же доступными для igor@155: использования с помощью l3text. igor@155: igor@155: l3text — это набор инструментов, для работы с транскриптами сеансов, igor@155: сгруппированные под одной крышей. igor@155: igor@155: Некоторые примеры использования. igor@155: igor@155: Показать весь журнал команд в текущем контексте igor@155: (начиная с текущего положения). igor@155: $ l3text cat igor@155: igor@155: Показать только командные строки или только вывод: igor@155: $ l3text cat -c igor@155: $ l3text cat -o igor@155: igor@155: Показать последние 10 команд: igor@155: $ l3text tail igor@155: igor@155: Показать последние 20 команд: igor@155: $ l3text tail -20 igor@155: igor@155: Следить за текущим сеансом, то есть показывать все команды, igor@155: выполняющиеся в текущем контексте: igor@155: $ l3text tail -f igor@155: igor@155: По умолчанию показываются только команды и результаты их выполнения. igor@155: Вывод можно настроить: igor@155: $ l3 cat -o time,cline,output igor@155: igor@155: == Контекст == igor@155: igor@155: Все команды, которые вы набираете, и результаты их выполнения igor@155: не повисают в воздухе, а дописываются в конец листов, igor@155: находящихся в определённых местах. igor@155: igor@155: Лист, на который попадают команды называется ''контекстом записи''. igor@155: igor@155: Вы можете набирать команды в разных окнах, igor@155: но если они находятся в одном контексте, то они запишутся igor@155: на один лист, одна под другой. igor@155: igor@155: С другой стороны, в одном окне вы можете поменять контекст несколько раз, igor@155: и команды, набиравшиеся в этих контекстах, попадут на разные листы. igor@155: igor@155: По умолчанию контекст равен /default , igor@155: но для удобства дальнейшей работы с записями рекомендуется igor@155: задавать нужный контекст, которому соответствуют выполняемые действия. igor@155: igor@155: Сменить текущий контекст записи можно так: igor@155: l3 context /path/to/new/context igor@155: igor@155: Просмотреть контекст записи можно так: igor@155: l3 context igor@155: igor@155: Итак, контекст записи (контекст агента) определяет, igor@155: куда попадают команды при записи. igor@155: igor@155: Мы записывали команды не просто так. igor@155: Мы хотим поработать с тем, что мы записали. igor@155: Лист, на котором записаны команды, с которыми мы хотим igor@155: поработать, определяется ''контекстом чтения''. igor@155: igor@155: То есть он определяет, какие именно команды igor@155: из записанных ранее мы имеем в виду. igor@155: igor@155: По умолчанию текущий контекст чтения становится равным igor@155: текущему контексту записи. igor@155: igor@155: Смена текущего контекста чтения: igor@155: $ l3 cd /path/to/new/context igor@155: или igor@155: $ l3 go /path/to/new/context igor@155: igor@155: Просмотр доступных контекстов: igor@155: $ l3 ls igor@155: igor@155: Просмотреть имя текущего контекста чтения: igor@155: $ l3 pwd igor@155: igor@155: Символы : и / являются в имени контекста специальными. igor@155: igor@155: Символ / формирует иерархию контекстов, igor@155: а символ : указывает координаты строки в контексте. igor@155: igor@155: Перейти на 3 команды назад: igor@155: $ l3 go :-3 igor@155: igor@155: Перейти в контекст /adm/lab1, в его самый конец (и находиться igor@155: всё время в конце, если он растёт, то есть делаются новые записи): igor@155: $ l3 go /adm/lab1 igor@155: igor@155: Перейти в контекст /adm/lab1, на первую команду grep: igor@155: $ l3 go /adm/lab1:/grep/ igor@155: igor@155: О том, как указывать координаты интересующих нас строк, igor@155: написано ниже, в разделе «Интервалы». igor@155: igor@155: igor@155: == Команда == igor@155: igor@155: l3 [ОПЦИИ1] [ИНТЕРВАЛ] [filter ВЫРАЖЕНИЕ] [grep РЕГВЫР] [КОМАНДА] [ОПЦИИ2] igor@155: igor@155: == Интервалы == igor@155: igor@155: По умолчанию операция выполняется над всеми командами, igor@155: находящимися в текущем контексте, начиная с текущей точки и до его конца. igor@155: igor@155: Можно ограничить команды с помощью интервала: igor@155: igor@155: выражение igor@155: выражение,выражение igor@155: igor@155: Примеры: igor@155: igor@155: -10,. последние 10 команд igor@155: .,+3 от текущей команды три вниз igor@155: /grep/ последняя команда grep igor@155: o/grep/ последняя команда, содержащая grep в выводе (output) igor@155: . текущая строка igor@155: @12:23 команда, выполненная в 12:23 (12:23 текущего часа) igor@155: @08:12:00 команда, выполненная в 8:12:00 (или ближайшая после этого времени) igor@155: 1 первая команда в контексте igor@155: $ последняя команда в контексте igor@155: % весь контекст igor@155: igor@155: igor@155: Интервал указывается перед командой, работу которой он ограничивает: igor@155: igor@155: l3 -10,. cat igor@155: напечатать последние 10 команд igor@155: igor@155: равносильно этому: igor@155: l3 tail -10 igor@155: igor@155: интервал = строка igor@155: интервал = строка,строка igor@155: интервал = % igor@155: строка = число igor@155: = -число igor@155: = +число igor@155: = @время igor@155: = /регвыр/ igor@155: = . igor@155: = $ igor@155: igor@155: == Фильтрация == igor@155: igor@155: Можно указать дополнительный фильтр, igor@155: который оставляет команды, которые нас интересуют. igor@155: igor@155: Есть два вида фильтров: igor@155: * по регулярным выражениям igor@155: * по вычисляемому выражению (синтаксис perl с некоторыми отличиями) igor@155: igor@155: grep -v regexp инверсия igor@155: grep regexp прямой поиск igor@155: igor@155: -f полный igor@155: -o только в выводе igor@155: -c только в команде (по умолчанию) igor@155: igor@155: filter выражение igor@155: igor@155: == Команды == igor@155: igor@155: cat igor@155: tail igor@155: head igor@155: history igor@155: igor@155: Все эти команды являются сокращением для одной команды. igor@155: igor@155: == Зачем всё это нужно == igor@155: igor@155: * использование данных вывода команд при автоматическом продолжении команд igor@155: * быстрое выделение и копирование команд igor@155: * поиск команд igor@155: * привязка ко времени igor@155: * подключение к журналу igor@155: igor@155: === Tab-completion: Данные вывода команд при наборе других команд === igor@155: igor@155: Вы выполнили одну команду, igor@155: и хотите использовать результаты её исполнения igor@155: в качестве аргумента другой. igor@155: igor@155: Например, вы просканировали wifi-сети: igor@155: # iwlist scanning igor@155: В выводе команды присутствовали названия SSID, один из которых мы будем использовать дальше. igor@155: Было бы классно, если бы дальше, когда мы вводим команду igor@155: # iwconfig wlan0 essid ____ igor@155: мы могли использовать табуляцию при наборе essid. igor@155: igor@155: В качестве списка возможных продолжений igor@155: должны использоваться сети, которые выдала предыдущая команда. igor@155: igor@155: Это становится возможным с использованием l3text igor@155: (при написании соответствующих расширения для bash_completion). igor@155: igor@155: === Быстрое выделение и копирование команд === igor@155: igor@155: Ваш друг помогает вам настроить систему по джабберу. igor@155: Он присылает вам команды, которые вы творчески перерабатываете igor@155: и вводите в консоль. igor@155: igor@155: Потом, для того чтобы он видел, что получается, вы копируете результаты igor@155: исполнения ему в джаббер. igor@155: igor@155: Например, вы хотите показать результат пяти последних команд: igor@155: igor@155: В самом простейшем случае (если вы используете графический-джаббер клиент) igor@155: l3 tail -5 | xsel igor@155: igor@155: Потом идёте в джаббер-клиент и делаете: igor@155: shift-insert igor@155: igor@155: Можно отправить ему код прямо из консоли: igor@155: l3 tail -5 | sendxmpp igor@chub.in igor@155: igor@155: Или даже ещё проще, всё, что вы делаете будет копироваться ему: igor@155: l3 tail -f | sendxmpp igor@chub.in igor@155: igor@155: Или, если вы не хотите, чтобы копировались команды, набранные неверно: igor@155: l3 filter err!=128 tail -f | sendxmpp igor@chub.in igor@155: igor@155: igor@155: Команды l3 не обязательно вызывать в той сессии, где идёт настройка. igor@155: Вы можете их вызывать в соседнем терминале, где вообще не идёт запись. igor@155: Конечно, вы должны будете указать соответствующий контекст. igor@155: igor@155: l3 cd /adm/lab1 igor@155: igor@155: (предполагается, что настройка идёт в /adm/lab1 ) igor@155: igor@155: === Поиск команд === igor@155: igor@155: Вы выполняете настройку сервера, igor@155: в ходе которой сделали много инсталляций пакетов. igor@155: igor@155: Вы делали их в разных окнах, уже сами не помните в каких, igor@155: но запись всё время шла. igor@155: igor@155: Вы хотите увидеть имена пакетов, которые были установлены. igor@155: igor@155: Простейший вариант: igor@155: igor@155: l3 grep apt-get igor@155: igor@155: Если вы помните, что начали работу по инсталляции после обеда, igor@155: а всё, что было до этого, к делу не относится: igor@155: l3 @14:00:00,$ grep apt-get igor@155: igor@155: Если вы помните, что было много инсталляций, но в некоторых из них igor@155: вы неправильно указывали имена пакетов, и вы хотели бы оставить igor@155: только те из них, которые выполнились успешно: igor@155: l3 grep err=0 grep apt-get igor@155: или igor@155: l3 filter err=0&&/apt-get/ igor@155: или igor@155: l3 filter err=0 grep apt-get igor@155: igor@155: === Привязка ко времени === igor@155: igor@155: Вы рассказываете, как настроить какую-то вещь. igor@155: Вы хотели бы, чтобы всё, что вы рассказываете, igor@155: можно было использовать как основу для составления igor@155: более подробного документа. igor@155: igor@155: Вы используете доску (или графический планшет), igor@155: некоторые вещи делаются не в командной строке, igor@155: а на экране с графическим интерфейсом, igor@155: кроме того ваш голос записывается. igor@155: igor@155: Вы не можете тратить время на то, чтобы положить скриншоты igor@155: в нужное место, но вы можете их сделать. igor@155: Аналогично и со скринкастами. Вы можете записывать то, igor@155: что вы делаете при подключении к какой-то системе, igor@155: но вы не можете выполнять никаких других операций igor@155: по обработке записи. Потому что на это просто нет времени. igor@155: igor@155: Ход вашей работы фиксируется, операции запоминаются, igor@155: скриншоты помечаются временными метками. igor@155: Аналогично происходит со схемами на доске, igor@155: которые фотографируются и представляются в виде помеченных igor@155: временными метками файлов. igor@155: igor@155: После того, как сеанс окончен, igor@155: вы получаете его транскрипт, который можно дальше редактировать. igor@155: Команды в этом транскрипте сопровождаются специальными якорями, igor@155: с помощью которых они привязываются к записанному ранее сеансу. igor@155: igor@155: В транскрипте вы удаляете лишние команды, igor@155: добавляете текст и получаете документ, igor@155: который подробно описывает происходившее, igor@155: причём при желании вы можете получить недостающую информацию igor@155: из архива сделанных ранее операций. igor@155: igor@155: Туда же, в нужные (соответствующие времени) места, igor@155: автоматически попадают сделанные скриншоты, igor@155: скринкасты, фотографии, запись звука. igor@155: igor@155: igor@155: === Подключение к журналу === igor@155: igor@155: Продолжим предыдущий пример. igor@155: igor@155: Вы прочитали документацию, составленную по описанной выше методике, igor@155: и теперь хотите выполнить такую же настройку. igor@155: igor@155: В обычном случае вы просто копируете команды в свою командную строку igor@155: или набираете их заново, с учётом ваших собственных условий. igor@155: igor@155: Можно значительно ускорить и упростить этот процесс, igor@155: а так же уменьшить вероятность ошибки возможной в ходе его выполнения. igor@155: igor@155: Вы подключаетесь к сделанной записи: igor@155: l3 go http://xgu.ru/l3/option-82 igor@155: igor@155: Все рассмотренные ранее команды становятся доступным. igor@155: igor@155: Становится доступным продолжение команд (tab completion) igor@155: на основе информации, набранной в той работе igor@155: и даже больше: вы можете добавить команды igor@155: из контекста в историю текущего командного интерпретатора, igor@155: как будто вы их сами уже выполняли. igor@155: igor@155: Автоматически они не добавляются, чтобы не создавать путаницы. igor@155: Но вы можете их загрузить: igor@155: l3 % | l3hist igor@155: или, если вас интересуют только определённые команды, то с использование интервала, igor@155: например: igor@155: l3 @14:00,$ | l3hist igor@155: igor@155: Вам тогда не нужно будет их заново набирать. igor@155: Достаточно прокрутить историю вверх, а потом просто выполнять igor@155: по одной, нажимая ctrl-o, при этом адаптируя к своим условиям. igor@155: igor@155: Чтобы ещё сильнее сократить себе объём работы, igor@155: можно применить процедуру адаптации, которая позволяет igor@155: автоматически заменять специфические для процедуры параметры. igor@155: igor@155: Для этого вы вызываете: igor@155: l3 parameterize igor@155: l3 param (сокращённо) igor@155: которая открывает текстовый редактор, где указывается два столбика параметров: igor@155: что заменить и на что заменить. igor@155: igor@155: Например, пусть в описанном документе используются адреса: igor@155: 192.168.15.1 igor@155: 192.168.15.254 igor@155: example.com igor@155: igor@155: Причём составитель этого документа мог указать, что эти параметры являются специфичными, igor@155: а мог не указывать. Если он указал, то совсем хорошо — тогда вам нужно просто пройтись igor@155: и добавить справа, на что они должны заменяться в вашем случае. igor@155: Если же он не указал, то вам нужно придумать список замен по своему вкусу. igor@155: igor@155: Вы вводите локализованную версию: igor@155: 192.168.15.1 10.0.35.1 igor@155: 192.168.15.254 10.0.35.254 igor@155: example.com xgu.ru igor@155: igor@155: Теперь, во всех выводах команды l3 будут исправленные команды igor@155: и исправленные результаты их выполнения. igor@155: Автопродолжение (tab completion) в шелле уже будет показывать исправленные аргументы. igor@155: Историю командного интерпретатора вы тоже можете обновить, igor@155: и в ней тогда будут изменённые команды. igor@155: igor@155: Использовать параметризацию с загрузкой удалённого контекста igor@155: настолько логично, что вы можете это сделать одной командой: igor@155: l3 go -p http://xgu.ru/l3/option-82 igor@155: igor@155: