Shell: интерпретатор командной строки и … оболочка. Zsh, Bash и т. п.

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

Мы выкатлили список требований к этой оболочке и начали доказывать, что шелл и есть та самая оболочка, которая все это здорово умеет. На самом деле не все и не все здорово, мы даже нашли нескольк мест, гждешел и его процессы пасуют (когда надо обрабоатывать несколько потоков данных одновременно).

Концепция единости языка программирования и интерфейса командной строки достаточно хорошо удовлетворяется шеллом.

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

Поначалу самый первый шел ш совсем не имел инструментов по взаимодействию с пользователем кроме ввода команды и нажатия на ентер для отправки на выполнение. Если пользователь должен был работать более чем один раз, подразумевалось, что пользователь будет редактировать команду в текстовом редакторе. Старый бздшелл он как раз так себя вёл. Это, конечно, было ужасно. Отсутствие примитивных интерфейсоулучшателей для пользователя бесило. А ещё людей бесило, что им нужно учить целый новый язык программирования, не лучше ли вернуться к старому доброму си.

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

расширенным аналогом на сегодня того шелл является проект dash, в альте называется ash. Ну и собственно то, что называется шеллом бзд. оба в плане интерфейса далеко ушли от шелла исходного, старого, но во всём остальном они достаточно адекватно его представляют,п оэтому если вы хотите иметь представление о том, как написать шелл скрпит, работающий везде, то нужно пользоваться документацией по одному из них. Позикс шелл. Это именно позикс, позикс это и стандарт на библиотечные вызовы и на командное окружение.

Деш и бздшелл реализуют стандарт и некоторые расширеня.

Возвращаясь к истории шелла. Те самые люди, которые решили, что с тем шеллом работать невозможно решили, что с тем шеллом работать невозможно. csh -- редактирование предыдущей командной строки происходило специальными командами.

Сделать командный интерпретатор с языком программирования воспроизводящим си невозможно в принципе. поээтой причине синтаксис полусился очень замороченным. Учитывая, что и грамматика си контекстно завсисмая, грамматика сишеллла получилась очень замороченная.

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

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

Если вам кажется что вы много работали в комстроке, но не читали соотв часть документации, мало в ней работали.

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

Из сишелла вырос tcsh. В нем было довольно много всего, в частности навороченная работа с комтсрокой. Заменил сишелл в фриибзд. Там появились массивы, сильно изменился язык, но сохранилась совместимость с сишеллом. Многое было проделано для эффективности взаимодействия с пользователем.

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

У корнщелла кстати появлися public kornshell, нужен для пуска старых сценариев от ksh.

Считалось, что для работы удобен сишелл, а для програмирования просто шелл, чтобы сохранять соместимость по позиксу. Ситуация изменилась, когда появились свободные реализации типа баша и зшелла. Считается, что вам ничего не стоит установить кого-нибудь из них. Хорошим тоном являетс янаписание программ на позикс шелле, но часто пользуются башем.

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

Итак, что появилось по сравнению с шеллом.

1) Редактирование командной строки. Если вы думаете, что это просто, прочитайте документацию по readline, zle. Если вы чувствуете, что вам неудобно -- надо лезть туда. Оцените глазом, сколько всего там можно сделать. Туда входят.

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

Если вы думаете, что на всех современных компьютерах они возвращают одинаковый сканкод, то вы сильно уливитесь, что сканкоды у клавиатур разные, и ещё и получить их непросто.

А тут всё хотябы можно свести к какимт-то байтам ESC[[A

Чтобы удобно редактирвоать ввод, соотв подсистема должна обращаться к терминфо и должна выковриывать оттуда информацию.

В этом была ошибка корншелла -- он был рассчитан на использование ровно одного типа терминала.

После того, как шеллы научились работать с терминфо, всё пошло на лад и можно было фантазировать. Лектор использует

1)начало и конец строки.

2)переход по словам на слово вперед на слово назад

3) Волшебная комбинация еск подчеркивание -- последний параметр предыдущей команды

Если шелл неправилно распознал терминал, все ваши стрелоччки и еск последовательности шелл будет распознавать как эротический сериал "полная ахинея". Тогда включается vi мод. Вы работаете с комсторокй как в ви, без использования стрелочек и странных клавиш вообще.Если вы беспорядочно начнете даваить на лкавиши, шелл почти наверняка перейдёт в ви компатибл мод. И это очень удобно.

Почему вообще терминал может неопознаться? Чащще всего, когда вы из линукса ходите куда-нибудь, где он не прописан. Или хтерм, или скрин. Вы заходите на удаленную машину при помощи ссх, и выясняется, что тот тип терминала, который секуршелл притащил, там не распознается. Второй вариант -- вы вместо секур шелла воспользовались невиданой фигней, а он не передал тип терминала.

Третье -- у вас тип хтерм, а с той стороны система думает,что хтерм это совсем другое.

Работа с историей.

её надо хранить. Несколько параллельных сеансов работы надо объединять. Причем непончтно как. Если объединять внезапно, то можно поломать паттерн поведения -- ленть писать шеллскрипт, понажимаю несколько раз по три раза клавишу вверх.

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

1) reverse search. Поиск в истории по подстроке. историю команд можно использовать для хранения невыполненных команд (ставить комментарий в начале строки). Можно настроить шелл чтобы он сохранял только синтаксически правильные команды. История команд непростая штука и очень удобная.

Забыл рассказать про шаблоны и файл нейм дженерйшн.

Шаблоны типа *

ls *

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

Второе -- это исп для превращения одной строчки в несколько. Можете сгенерировать список файлов.

Шаблоны похожи на регвыры, но попроще. не задают даже автоматного языка. * люое колво символов ? ровно один символ, и отрицательный диапазон[^], диапазон []. дальнейшие правила генерации имен читайте вдокументации.

Стоит заметить, что шаблоны используются не только в именах файлов, но и в case. неструкутрынй оператор, который есть во всех языках структурногопрограмирования. В операторе case может встречаться шаблон.

Генерация имен файлов это именно генерация имен файлов. Подстановка будет происходить по сгенрированному списку. Важно, подставноку шаблоно и списка делает шелл. команда ls не увидит, что ее параметром был шаблон, она увидит просто списко файлов. Так же как и рм. Чтобы современные рмы могли отслеживать *, он должен либосмотреть на спсиок всех файлов, либо сам зыш будет спрашивать.

Если ухищрений не предпринимать,то шаблон превращается в список, и уже список подается на вход команде. echo * -- эхо получит столько параметров, сколько есть в этом списке.

** -- в чём определённый недостаток шаблона в том виде, в котором рассказан. Он просматривает тлько текущий каталог. бывает немножко другая задача. Есть катлог с подкатолгами. Хтим чтоб получился список си файлов во всех подкаталогах. Лень писать find. На автомате пишется rm `find dir -name "*.o". В zsh можно так rm dir/**/*.o . Читается лучше, но зшелл-баш специфично.

Общая болезнь расширений -- чем шире расширеннее, тем оно неочевидней.

Сокращения, алиасы.

Достаточно простой механизм. Не очень активно используется, но у него есть волшебной свойство. Как вместо длинной команды сделать короткую. Шаг назад -- всё что связано с привзякомй команд на клавиши делается не напрямую. В случае ридлайна есть .inputrc, в случае zle есть командочка bind. Которая определяет каким клавишам какие команды ссотвествуют.

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

В альтилинуксе есть алиас rm ="rm -i" . Это означает, что рм всегда будет спрашивать, хотите ли вы удалить файл.

Алиасы нерекурсивные, и это хорошо. Ещё хорошо, что алиасы используются только ри интерактивной работе. При выполнении скриптоа этого не будет. Ещё алиас это очень легковесаня команда. (В отлисие от скрипта с подложным именем)

pushdir popdir -- история посещаемых каталогов. Мы имеем дело с системными объектами. Пространство имен это просто пространсвто имен файлов. Смена текущего каталога это эффективный инструмент навигации. Когда вы занимаетесьэтим интерактивно очень часто бывает, что вы посещаете одни и те же кататлоги, и хотите

сказать cd туда и cd обратно.

cd - -- возврат в предыдущий каталог

Более мощный инструмент pushd popd, который хранит стек каталогов.

dirs показывает список.

Там есть всякие разные параметры.

Отдельная мрачная песня это волшебная клавиша таб. Достраивание.

Достраивание было чуть ли не сишелле. Правда только имен файлов. Что такое достраивание? вы нажимаете волшебную клавишу, а шелл начинает вам предлагает команды, которые вы могли бы хотеть выполнить.

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

После файлов появилось достраивание имен команд. Первое слово по табу достравиваается из PATH. Всё остальное тоже самое -- писк мрачный, менюшка. Когад в классе 24 человека, и все пробуют освоить достраивание, особенно четко понимаешь, что этот писк мрачный.

Если шеллу внедрить искусственного мозга, то если емуговорить ssh TAB. Туда мы надо взять удаленные машины на которые вы ссхаетесть. Их список можно взять из known_hosts.

ВСех случаев невозможно учесть. например тип файловой системы при mount oloop а не mount -loop -o. Комплишены это страшная вещь.

Скоро все команды можно будет ввести одинм табом.

У зшелла порядка 500Кб документации. В зшелле есть ассоциативные массивы, мультио, манипуляции с потоками данных (перенаправление ввода и вывода в несколько файлов) и прочая туча всего.

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

. имя

Текущий шелл читает оттуда все команды и их выполняет. У такого спобсоа работы есть 1 серьезное перимущество -- для выполения команд используется тот же самый шелл, нет проблем с экспортом и с переменными. Другого спобсоа кроме eval поменять в скрипте значения переменных в текцщем окружении нет.

Если вы имеете дело с каким-то сложным шулл сценарием с подключаемыми другими шелл сценариями, они как правило вызваются вот тут. Если будет ошибка,то выполение вашего шелла прекратится. Поэтому этим надо пользоваться разумно.

Если была ошибка, когда вы сказали точка, то вы уже не вернетесь.

Расширения -- с тех пор как появился позикс шелл, появилось бесчисленное число расширений. Уже упоминали про башизм -- написание на синтаксисе баша, не соместимом с позикосм.

В зыше расширений ещё ольше. И в генерации имен файлов. И в подстановке значений. огВтом же зшелле есть всякие синтаксические вкусности.

Помимо ** есть хитрости. Например моэжно сгенерировать список только исполняемых файлов.

Насчет использования расширений есть два мнения -- лекторское и ошибочное. Лектор лично считате, что при работе с комстрокой, чем больше расширений вы выучите, тем лучше. А вот при написании шелл сценраиев лучше ограничиваться стандартом (если это не лично для себя) подумайте о том, что там может не быть зшеллла.

Линукс без баша редок, но вообразим -- всякие busybox.

Если ваши сценарии используются при пуске системы когда ещё нету бина, будет только ш.

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

Если пишете на баше, указывайте шибан.

Только вот если баш лежит в другом месте, то это может не заработать.

Или разноверсица башей.

Хотения баша и глибсей другу другом.

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

В более продвинутых шеллов файлов вызываемых при старте нового шелла много. .profile, .zprofile, .login .logout .zshenv , .zshrc(только для интерактивного).

LecturesCMC/GnuLinuxArchitecture2012/Conspects/07 (last edited 2012-05-01 19:46:41 by Allena)