UNИX, весна 2008, 09 лекция (от 09 апреля)

Материал из eSyr's wiki.

Перейти к: навигация, поиск

Лектор был всю прошлую неделю в Якутске. Там нашёл линуксоида, который самостоятельно перевёл контору на Линукс.

Про линукс в школах ...

Господа из тех, кто лучше знаком с предметом: проявляйте активность и говорите, о чём расск. заранее.

Маленькое дополнение к пред. лекции о file name generation: в zsh есть **, и **/*.c развернётся во все *.c во всех подкаталогах текущего каталога

Тема: редактирование ввода

Шелл един в трёх лицах, у него 3 ипостаси: шелл это оболочка, шелл это интегратор, шелл это интерфейс с человеком. Про то, как последнее можно сделать более удобным, лектор и попытается обозреть. Одним шеллом это не ограничивается, и не с него начинается. Начинается всё с терминала, который не просто устройство для ввода и вывода человекочитаемых байтов, он их ещё и обрабатывается (cooked-режим). Он позволяет обрабатывать Ctrl-c, и другие в некоторые специальные сигналы. Почему так происходит? Потому что мы stty настроили таким образом, что Ctrl+C посылает SIGINT. Разговор о том, что помоимо превращю. в сигналы, терминальная линия обесп. ещё некоторые вещи. Например, преобразование сиволов конца строки. Например, в принтерах CR-LF, в фапйлах просто символы конца строки. И терминал этим занимается. В частности, в линуксе в терминале уже определно три символа: удаление символа, слова, всей строки. Команда stty выведет ERASE (символ), KILL (строка), WERASE (слово). Соответственно, обычно это Backspace, Ctrl+U, Ctrl+W. Проблема с BS, который в разных терминалах разный, в частности, одно из исключений --- терминал Linux. Соотв., с этим BS возникнет ряд проблем, например, в vim это решили тем, что ручками вбили все возм. варианты. Кроме того, чтение line-buffered, то есть программе не придёт данные, пока не нажмёте конец строки (ещё один спецсимвол), и редактируя эту строку, уже имеете три команды едактирования. Это не просто примитив, а минимализм устрашающий. Кстати, sh и ash не имеют встроенных средств ред. строки в принципе. Это дисциплинир. польз. --- если команда слишком длинная, то это значит, что надо открыть текстовый редактор и написать скрипт.

Есть очень большой раздел про редактирование командной строки. Этот встроенный предактор командной строки характерен для многих утилит, которые выходит из GNU, и не только. Тот же питон написан с libreadline. Для того, чтобы освоить весь readline, читайте ман, обычно работают стрелочки, Home|end, это следствие того, что исп. readline. libreadline имеет свой настроечный файл, который наз. .inputrc, про который лектор тоже расскажет.

Что такое .inputrc? Это привязка клавиш, которые нажимаете на клавиатуре (например, стрелочек) к командам текстового редактора, редактора командной строки. Вы сами всё можете перенастроить. Например, если у вас есть специфические команды, например, перемещение по словам. Вписываете это в inputrc. Команд этих в баше в районе полусотни. Что это за команды помимо команд перемещ. по строке?

  • Перемещ. на разные единицы строки
  • Команды редактирования (апкейс/даункейс)
  • Глупости типа переставления местами символов

Реально редактирование символов устроено на уровне vi. Кстати сказать, для больших фанатов vi, а также для тех, у кого плохо с ... обратите внимание на то, что в отл. от обычных буковок (когда передаётся один байтик) всякие клавиши, не явл. обычными клавишами, типа стрелочек, возвращ. не один символ, а сразу несколько. Это сделано по аналогии с терминалом, с управл. последовательностями. Например, перемещение в начало ... --- ^]]A, где ^] --- Ctrl+], Esc. (срезается 6-й бит). В terminfo хранится именно то, какие упр. посл. посыл. при нажатии клавиш. Есть программа ...dump, начинаете нажимать на кнопки и смотрите на дамп. Вот это вот можно забиндить в .initrc на выполнение команд в readline, и поскольку с reasdline собрано много программ, от оно будет приниматься во внимание многими программами.

Есть встроенная в шелл команда bind, которая позволяет на ходу это записать. Далеко не все функции, которые есть в бинде, относятся к функциям именно редактирования командной строки. Например, есть такая отдельная и совершенно естественная для польз. штука, как работа с историей. Лектор не зря при рассказе не упоминал про стрелки вверх/вниз, это уже свойство редактора, в котором вы работаете. То есть, это требует от шелла сущей безделицы --- где-то хранить команды и осущ. по ним поиск. Есть обычное пролистывание, есть также поиск: по умолчанию есть ^R (reverse search), и это возм. поискать в истории команд подстроку. Например, Дима Левин, когда ему пришла в голову команда, а потом решил её не выполнять, он ставит перед ней решёточку, и жмёт ентер, а потом находит её по ^R. Разумеется, поиск и в другую сторону работает. Про историю надо знать три важные вещи:

  • по умолчанию историю выключают. История ваших команд призрачный, но security flaw. Вообще говоря, поднимаясь на уровень достаточной параноидальности, историю команд лучше хранить в памяти. История может храниться в файле, размер файла задаётся в строках в переменной HISTSIZE.

Что ещё можно вспомнить из команд редактирования? Лектор не знает, есть ли это в баше, но в zsh есть фича, которая позволяет сделать inplace file name generation. Для чего это нужно: чтобы ручками подредактировать.

Ещё одна главная вещь: достраивание. Очень часто бывает вещь (очень часто это бывает с именами файлов), что начало написали, а дальше лень. Если файл один, то можно дописать звёздочку. В командной строчке никому не хочется писать имя файла длиной в пять шагов. Но какая проблема с таким FNG? Проблемы две: /u*/sh*/doc/vo*/RE* читается намноого хуже. Второе --- не факт, что файл всего один. Но помнить имена всех файлов невозможно. Поэтому неплохо этот процесс контролировать. Делается это следующим образом: нажали таб и шелл достроил. Это то самое, о чём всегда мечтали. При этом процесс контроллируемый и последовательный. Это резко отличается от того, когда написали шаблон и посмотрели, что получается. Кроме того, могут быть ветвления. Эта проблема процедурой достр. также решается. Если упираетесь в ветвление, например, если есть voodoo и voobla, то он достроит voo и пискнет. А дальше, в зависимости от крутизны шелла, могут быть варианты. Может быть сразу начнёт перебирать варианты, может после второго шага, может список показать. Соответственно, ответственность переваливается на пользователя, ибо думать должен человек, а не машина. И человек уже решает, что строить дальше.

Использование достраивание сокращает время в разы. Кроме того поведение достр. в случае неоднозначности настраиваемо. По умолчанию баш пищит, потом перебирать начинает.

Достраивание контекстнозависимое, например в случае с echo $PA будет работать подстановка имени переменных. Возможно, в баше есть другие вариант достраивания. Но в zsh оно устроено так, что святых выноси. Для польз. это выглядит след. образом: достравивание в zsh настолько контекстно, что он разбирается в том, к какой команде производится достраивание.

Если некую задачу по написанию строки можно доверить компьютеру, можно доверить компьютеру.

Лектор не знает, рассказывал ли это Наану, но в виме это тоже есть. Там есть 6 или 7 разных достраиваний

  • По именам файлов
  • По словам в тексте
  • По спец. списку ключ. слов
  • По словарю для рабоы с консретным ЯП
  • По чёрт ещё знает чему
  • ^X^F --- достраивание по именам файлов
  • ^X^P, ^X^N --- достраивание по словам внутри текста

Что ещё предусм. в шелле на предмет редактирования командной строки.

  • ^]_ --- позволяет в шелле подставить последнее слово предыдущей команды. Полезно при обработке файла. Можно множитель масштабный приклеивать.

Есть ещё vi-mode, помогает при извращённом терминале.

Ещё, чем в полож. сторону отличается zsh от bash. В readline нельзя привязать команду ридлайна не к конкретной esc-последовательности, а к терминфо. А в zsh используется свой line editor, и в bindkey это можно сделать.

bindkey `echo tc kP` prev-word

Алиасы

Это шеллскрипты для бедных. Возможность определить некий укороченный вариант команды. Например

alias rm='rm -i'

Необязательно переопределять команду:

alias l='ls -FAC'

Рекурсивного подставления в алиасе не происходит, но происходит вложенная подстановка

Заменяется слово. Фактически, добавляете новую команду.

Стартовые сценарии

При старте было бы неплохо вписать алиасы, настр. переменых, и так далее. У каждого шелла есть набор сценариев, которые выполн. по умолчанию.


UNИX, весна 2008


Лекции

01 02 03 04 05 06 07 08 09 10 11 12 13 14


Календарь

Февраль
13 20 27
Март
05 12 19 26
Апрель
02 09 16 23 30
Май
07 14
Семинары

01 02 03 04 05 06 07


Календарь

Март
21
Апрель
04
Май
16 30
Июль
11 18
Август
15


Эта статья является конспектом лекции.

Эта статья ещё не вычитана. Пожалуйста, вычитайте её и исправьте ошибки, если они есть.
Личные инструменты
Разделы