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

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

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

Диктофонная запись: http://esyr.org/lections/audio/uneex_2008_summer/uneex_08_03_12.ogg

Лектор открыл новый класс мышей, есть такая китайская фирма а4. Они стоят рублей 100-200-300, у них никаких закидонов, они сами собой определяются, дёшево и сердито.

У нас в позапрошлый раз про перенаправление ввода-вывода. Лектору пришло в голову, что больщую часть курса можно найти в мане по шеллу, но не все маны по шеллу одинаково банальны. Мы так бодро взялись за то, что умеет шелл, и в конце лектор начал рассказывать, что умеет зыш или баш. Здесь разумно вспомнить дерево разнообразных шеллов на предмет того, чтобы в них ориентироваться, и поговорить о явлении под названием башизм. Вспоминая первое сборище, лектор патлся набросать концепцию упр.компьютеров с ком. строки. Шелл это интегратор, есть много инструментов, которые работают с системой, есть два пространства имён, ФС и тест в них, а мы же, когда говорим про управление, должны вообразить клей или конструктор, всякии винтики-шпунтики-резиновые-колекчки, с помощью которых собираются решения. Главное свойство, которое мы требуем от шелла --- быть конструктором.

Мы возвращаемся к функциям оболочки. Такую оболочку быстро изобрели, собственно sh, автор Стивен Борн, это была довольна простая штука, и целью создания такого довольно простого, БСД-лайк шелла, была оболочка. Две другие задачи практически не рассматривались. Поскольку доволно скоро выяснилось, что эти три составляющие --- важная вещь, было изобретён альтернативный шелл, csh, у которого был синтаксис, другой, похожий на язык С, дабы не умножать сущности сверх необходимости. Но поскольку С был предназначен для других целей, трудно придумать области, где они были одинаково хороши, и он не был похож на язык С, люди путались, синтаксис у него был странненьким, но даже в области программирования цыш был лучше ш, в области редактирования тоже.

Довольно долго эта парочка существовала в таком виде, но и тогда стало ясно, что программировать лучше на шелле, а не на с-шелле. В недрах коммерческих юниксов разрабтывался ksh, который сейчас pdksh (public domain ksh), он продолжал sh, в него включены были многие функции, которые есть в sh, была лучше редактирование, скриптование, но он долгое время был несвободный, поэтому нужно было что-то предпринимать. В то же врем появился bash --- Bourne Again SHell, это была уже весьма продвинутая программа, написанная с помощью библиотеки readline. Там феерически был доработан интерфейс ком. строки, язык программирования, глубоко были доработаны средства интеграции. Параллельно с этим вышла ветка tcsh, которая перекрывала баш по всем статьям, кроме одного, синтаксис там был с-шелльный, и лет десять назад считалось, что работать надо в tcsh, программировать в шелле. Ну и zsh, самый продвинутый. Где-то в это время случилось знаменательное событие --- свойства sh были стандартизованы в POSIX. В каком-то классич представлении ни одна из этих программ не совместима с POSIX, наиболее похожи bash и zsh в режиме POSIX, но есть ещё два проекта --- sh в FreeBSD, что же касаемо дистрибутивов Linux, dash/ash, это программы, которые считаются в достаточной степени совместимы с POSIX, чтобы на них программировать. Есть одно отличие такая нудность в трактовке посиха.

Обратите внимание, что всё это идёт в развитии. Все эти программные продукты пишутся, развиваются. Тот факт, что существует стандарт, не мешает пользоваться нестандартными фичами, кроме того, удобство командной строки в стандарте не прописано. Тем не менее, если писать, то писать наиболее близко к стандарту, чтобы понимали все. Что же касается Линукса, то вероятность наличия там баша близится к 100 процентам, и есть такое явления, под названием башизм, когда пишут на баше. Среди крутых это считается моветоном. Ещё одним моветоном, даже большим, сччитается работа с терминалом, считая, что это линукс терминал, то есть, жёстко забитый еск-последоватекльности в скрипте для линух-терминалов.

Мы будем придерживаться мана по ash, но будем делать лирические отступления в область других шеллов, где этого недостаточно. В чем особенность --- неполное описание, постоянные ссылки на ПОСИХ. При этом этот мануал становится читаемым, в нём 25 страниц, в отличие от 400 страниц по zsh.

Лектор преупреждает о том, что считается моветоном писать использование фич баша. Тем не менее, лектор удивился, сколько штук включено в посих. Хотя, лектор напоминает, что и у баша, и у зыша есть ключ, котрый запускает их в компатибилити мод.

Сейчас продолжим тему интеграции. Сейчас разговариваем о том, что шелл явл. оболочкой, которая интегрирует другие утилиты. В прошлый раз говорили про перенаправление, что в юнихе существует класс объектов под названием канал, и перенаправление --- открытие канала, и одной программе в качестве стандартного вывода предл. одна сторона канала, другой в качестве стдин --- другая сторона. Мы поговарили про перенаправление ввода/вывода. Почему лектор настаивает на том, что этностися к части интегр.: есть много команд, которые занимаются обработкой и генер. текста, и надо это организовывать, и это перенапр. есть способ огр.

Продолжит лектор с темы окружение. Когда говорят про юнуксовые тексты, то там есть термин окружение. Что входит в понятие окружение:

  • Дескрипторы открытых файлов
  • Переменные окружения
  • ID Группы процессов, PID, UID, ... --- идентификаторы

Дело втом, что при порождении нового процесса в юниксе исп. два сис. вызова, форк и экзек, и оба вызова сохраняют окружение процесса. Это самое окружение --- эффективное средство упр. самим процессом. Какие способы модиф. поведения: параметры командной строки, конфиг-файлы, ... что делать программам среднего размера? с одной стороны, параметров конфигурации много, с другой --- конфиг излишен. Те модификаторы, которые хотите исправить, надо хранить в переменных. Переменные --- очень простая штука, у них есть имя, есть значение, строковые. Некоторые переменные окружения (практически все) являются управляющими. Например, PATH --- в нём хранится список каталогов, в которых лежат исполняемые файлы. Разумеется, очень удобно, что эта переменная окр. наследуется. Другой пример --- TTY, указывает то устройство, которое устройство вывода. Или EDITOR --- путь к редактору.... Их там довольно много, если сказать set, то можно увидить много переменных и не только Есть переменные, можно просто сказать var = QQ, и если её добавить в окружение командой export, то она помещается в окружение, которое наследуется.

Ради чего затеян сегодняшний разговор: ради понятия подстановки. В скриптовых языках программирования часто, для того, чтобы обеспечить более лёгкий синт. разбор, переменные предваряются долларом: echo $Var. Оно же взятие значения (подстановка значения) переменной. Это краткая форма, более полная: ${Var}. Но, помимо того, что такая подстановка значения происходит, с этим значением можно много чего поделать. Первое: подстановка через двоеточие ${v:[-=?+]word} первое --- если переменная пустая, то подставится word, второе --- то же самое, что с минусом, только переменной ещё присвоится значение, вопросительный знак --- если не определена, то произойдёт ошибка, и выведится текст, последнее --- если переменная есть, то будет использовать word. Это первый тип подстановок, который позволяет поплясать относительно определённости. Второй класс --- преобразование содержимого прееменной. ${#v} --- длина строки, содерж. символ. Ещё --- отрезание префикса и суффикса ${v%суффикс} --- отрезает минимальное, соотв. шаблону. {v%%суффикс} --- ототризание максимального суффикса. #, ## --- префиксы. Может быть не все знают, что это всё встроено в стандарт, а самое нужное и частое --- замено одного символа на другое нету.

Это всё к чему: подстановка знач. перем. подвергается некоей обработке. Более серьёзная обработка не предусмотрена. В баше/зыше предусмотрено большое количество флагов, и там чего только нельзя сделать: отрезать кусок опр. длины, превратить число из незвестно скольки цифр, в число фикс. длины. В зыше этому посвящено неск. страниц. Единственное, что непонятно --- зачем это нужно, если в перле оно не работает.

Каким образом сделать что-то развесистое, пользуясь стандартом, этот способ тоже называется substitutuion: $(команда)', `команда`, тут выполняется команда и результат подставляется вместо. В ЯП этого не увидите, эта команда нацелена на интеграцию. Фактически, если надо преобразовать строку, то вызвать команду, например, sed или tr. Например: New = $(echo "$v" | tr '[A-Z]' '*'). (рассказ про экранирование)

Обратите внимание на такуб простую штуку: у нас есть перенапр. ввода-вывода покомандное, и мы активно его исп., но чтобы превратить поток текста, который проходит через трубопровод, ничего дополнительно делать не надо. Опять-таки, в зыше может стоять какой-то флажок, который сделает что-то извратное. Это не стандрат, но это бывает удобно.

Ещё подстановкой называется арифметические подстановки. Не все знают, что арифм. подст. входят в посих. В частности, $((строка)), где вычисляются целочисленные выражения. Короче говоря, результат такой подстановки --- вычисленное выражение, содерж. в строке. Особенности новых шеллов, коотрые могут позволить сделать следующее: $((A+B)) --- так в стандарте делать нельзя, надо $(($A + $B)).

Есть две вещи, называемые подстановками.

Попробуем разобраться, в какой последовательности обрабатывается строка, когда она приходит к шеллу.

Докончим про шаблоны. Там ещё две вещи: в каком порядке применяются подстановки, и шаблоны.

Шаблоны. Ничего сложного нет, есть волшебный символ *, которые заменяется на все символы. Что такое шаблон: шаблон --- группа спец. символов, которые могут соотв. цепочкам символов. Эта группа символов исп. для того, чтобы сопост. с имеющ. шаблонов. Цепочка может подходить, или не подходить. Поставление шаблонов может быть разное, чаще всего используются регэкспы. В шелле используется более простой синтаксис. Шаблон, соотв. звёздочке, соотв. любой цепочке символов. Одиночный шаблон вопр. знак соотв. одному символу. Диапазон [символ1символ2символ3-символ4] соотв. одному символу из этого множества. С этим надо быть максимально осторожным, потому что порядок символов зависит от локали. Есть ещё [^...] --- символ не из диапазона. Шаблон, сост неспец. символу, соотв ему. Если встречается составной шаблон ... Шаблоны активно исп. шеллом для filename generation. В ком. стр. можно указывать вместо имени файла шаблон. Дело в том, что ... шелл попытается составить список файлов и превратит шаблон в список файлов. Если написать echo a*, то echo на вход подастся список файлов на букву a. fng происходит перед тем, как передаются параметры. С этим связан тот факт, что rm * не знает, что ей сказали звёздочку, она считает, что ей дали список файлов. Если шаблоны не экранировать, то они будут преобразованы. В FNG не входит слеш и файлы, начинающиеся с точки. Можно вообще отключить FNG.

Ещё одно: что будет, если ни одного файла на а не начинается. Первая линия поведения: выдать ошибку. Вторая --- не преобразовывать. По стандарту --- ошибка.

Что-то лектор не рассказал про модиф. окружение. Если внутренний шелл поправил, то обратно не пробивается. В след. раз что-нибудь другое.


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


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


Личные инструменты
Разделы