Хронология шеллов. Variable substitution
Хронология шеллов
Лектор открыл новый класс мышей, есть такая китайская фирма а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.
Лектор преупреждает о том, что считается моветоном писать использование фич баша. Тем не менее, лектор удивился, сколько штук включено в посих. Хотя, лектор напоминает, что и у баша, и у зыша есть ключ, котрый запускает их в компатибилити мод.
Variable substitution
Сейчас продолжим тему интеграции. Сейчас разговариваем о том, что шелл явл. оболочкой, которая интегрирует другие утилиты. В прошлый раз говорили про перенаправление, что в юнихе существует класс объектов под названием канал, и перенаправление --- открытие канала, и одной программе в качестве стандартного вывода предл. одна сторона канала, другой в качестве стдин --- другая сторона. Мы поговарили про перенаправление ввода/вывода. Почему лектор настаивает на том, что этностися к части интегр.: есть много команд, которые занимаются обработкой и генер. текста, и надо это организовывать, и это перенапр. есть способ огр.
Продолжит лектор с темы окружение. Когда говорят про юнуксовые тексты, то там есть термин окружение. Что входит в понятие окружение: * Дескрипторы открытых файлов * Переменные окружения * 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.
Ещё одно: что будет, если ни одного файла на а не начинается. Первая линия поведения: выдать ошибку. Вторая --- не преобразовывать. По стандарту --- ошибка.
Что-то лектор не рассказал про модиф. окружение. Если внутренний шелл поправил, то обратно не пробивается. В след. раз что-нибудь другое.