Это перевод статьи, оригинал — по ссылке.
В этот день, практически в канун католического рождества, 23 декабря 1996 года, вышла оболочка Bash версии 2.0. Последний мажорный релиз на сегодня — это версия 5.3. Сейчас Bash встроена почти во все версии Linux и MacOS, а также заявлена как встроенный компонент Microsoft Windows. Как следует из отчета State of DevOps 2024, доля инструментов на shell-скриптинге в текущем году продолжает расти. Все это говорит о том, что актуальность оболочек сохраняется по сегодняшний день.
Shell-скриптинг — это важная дисциплина для любого системного администратора, инженера. Преобладающая оболочка, в которой люди пишут скрипты сегодня, — это Bash. Bash поставляется по умолчанию почти во всех дистрибутивах Linux и современных версиях MacOS и, как ожидается, вскоре он станет неотъемлемой частью Windows Terminal. Bash действительно повсюду и это не фигура речи. Как до этого дошло? В сегодняшней статье мы глубоко исследуем этот вопрос, задавая вопросы именно тем людям, которые причастны к разработке оболочек.
Что внутри статьи:
Переосмысление оболочки Борна как свободного программного обеспечения
Чему история развития оболочек может научить нас?
Все началось с Unix
История большинства вещей в программировании заставляет нас вернуться к Unix. История оболочек начинается в 1971 году, когда Кен Томпсон выпустил первую оболочку Unix — Thompson shell. Тогда существовали серьезные ограничения на количество сценариев, которые могли выполнять пользователи. А это означало серьезные ограничения для автоматизации и, следовательно, для всей IT-сферы.
В этом исследовании описываются трудности, с которыми приходилось сталкиваться на ранних этапах работы с оболочкой:
Подобно своему предшественнику в Multics, эта оболочка (/bin/sh) была независимой пользовательской программой, которая выполнялась вне ядра. Такие концепции, как подстановка (сопоставление с образцом для расширения параметров, например *.txt), были реализованы в отдельной утилите под названием glob, как и команда if для оценки условных выражений. Такое разделение позволило сохранить небольшой размер оболочки, менее 900 строк исходного кода на языке C.
Оболочка представила компактный синтаксис для перенаправления (< > и >>) и конвейеризации (| или ^), который сохранился в современных оболочках. Также был реализован вызов последовательных команд (с ;) и асинхронных команд (с &).
Чего не хватало оболочке Томпсона – так это возможности писать и запускать скрипты. Её единственная цель – быть интерактивной оболочкой (командным интерпретатором) для вызова команд и просмотра результатов.
По мере расширения доступа к терминалам рос и интерес инженеров к автоматизации.
Bourne Shell — это шаг вперед
Через шесть лет после Томпсона, в 1977 году, Стивен Борн выпустил оболочку Bourne, которая должна была решить ограничения запуска скриптов оболочки Томпсона. Кстати, это была единственная разработка, вышедшая из Bell Labs как часть системы Unix.
Что Борн намеревался сделать по-другому? Исследователь М. Джонс писал:
«У оболочки Bourne было две основных цели: стать интерпретатором для интерактивного выполнения команд в операционной системе и для написания сценариев (написание повторно используемых сценариев, которые можно было бы вызывать через оболочку). Помимо замены оболочки Thompson, оболочка Bourne предлагала несколько преимуществ по сравнению со своими предшественниками. Борн ввел потоки управления, циклы и переменные в сценарии, предоставив более функциональный язык для взаимодействия с операционной системой (как интерактивно, так и неинтерактивно).
Оболочка также позволяла использовать сценарии оболочки в качестве фильтров, обеспечивая интегрированную поддержку обработки сигналов, но не имела возможности определять функции. Наконец, она включала ряд функций, которые мы используем сегодня, включая подстановку команд (с использованием обратных кавычек) и документы HERE (heredoc) для встраивания сохраненных строковых литералов в сценарий».
В одном из интервью сам Стивен Борн прокомментировал свою разработку так:
«Первоначальная оболочка на самом деле не была языком; это был способ выполнения линейной последовательности команд из файла, единственным примитивом потока управления была GOTO-метка. Это существенные ограничения оригинальной оболочки, написанной Кеном Томпсоном. Например, вы не могли легко использовать командный скрипт для фильтрации данных, потому что сам командный файл был стандартным вводом. А в фильтре стандартный ввод — это то, что вы наследуете от родительского процесса, а не командный файл».
Первоначальная оболочка была простой, но, когда люди начали использовать Unix для разработки приложений и написания скриптов, ее ограничения стали критичными. В ней не было переменных, не было потока управления, и она имела неполноценные возможности цитирования.
Эта новая оболочка делала огромный шаг вперед для инженеров, но только если у вас был к ней доступ.
Переосмысление оболочки Борна как свободного программного обеспечения
До этого момента доминирующие оболочки были проприетарным программным обеспечением, которым владела Bell Labs. Если вам повезет – ваш университет может иметь доступ к оболочке Unix. Но этот ограниченный доступ был далек от того мира, которого хотел достичь фонд Free Software Foundation (FSF).
Ричард Столлман и группа единомышленников-разработчиков писали все функции Unix с лицензией, которая свободно доступна по лицензии GNU. Одному из этих разработчиков было поручено создать оболочку. Им стал Брайан Фокс, вот как он рассказывает о своей задаче:
«Причина, по которой это было так сложно, заключалась в том, что нам нужно было точно имитировать поведение оболочки Bourne, и в то же время иметь возможность расширять ее, чтобы сделать ее более удобным инструментом».
Это было то самое время, когда люди обсуждали, что должно стать золотым стандартом оболочки. На фоне этого бэкграунда и существующей конкуренции оболочка Bourne была переосмыслена и рождена заново.
The shell, Bourne-Again
Эти два катализатора — миссия свободного ПО и конкуренция — породили оболочку Bourne-Again (Bash). Фокс не стал называть оболочку в честь себя, что было нетипично для того времени. Зато он сосредоточился на эволюции от Unix к свободному ПО (Fox Shell могла бы предвосхитить появление Fish Shell (fsh) #missedopportunity). И такой выбор имени, похоже, полностью соответствовал его личности. Как говорит Фокс, его не интересовала личная слава. Он старался помочь развитию культуры программирования. Тем не менее, в выбранном названии создатель оболочки смог сохранить тонкость игры слов.
Приятно слышать, что и Борн не почувствовал себя ущемленным названием новой оболочки – Bourne-Again. Борн рассказал историю о том, как кто-то подошел к нему и подарил футболку Bash на конференции. Этим человеком был Брайан Фокс.
Оболочка |
Год выпуска |
Создатель |
Thompson Shell |
1971 |
Кен Томпсон |
Bourne Shell |
1977 |
Стивен Борн |
Bourne-Again Shell |
1989 |
Брайан Фокс |
Со временем Bash становилась все более популярной. Другие инженеры начали использовать её и предлагать улучшения дизайна. Действительно, годы спустя Фокс будет настаивать, что научиться отказываться от контроля над Bash было одним из самых важных дел, которые он сделал в своей жизни. Когда Unix уступил место Linux и движению за программное обеспечение с открытым исходным кодом, Bash стала ключевой силой скриптинга в мире с открытым исходным кодом. Великие проекты, очевидно, выходят за рамки видения одного человека.
Чему история развития оболочек может научить нас?
Оболочка — это технология, которую многие из нас используют ежедневно, и легко забыть, что ее нужно было изобрести. История оболочки Bash позволяет сделать несколько выводов:
мотивированные люди могут добиться больших успехов, располагая правильной миссией;
многое из того, на что мы полагаемся сегодня, основано на работе все еще живых легенд нашей отрасли;
программное обеспечение, которое, как правило, «выживает», — это то, которое развивается за пределами видения своих первоначальных создателей.
#!/bin/bash
# Post scriptum. Давно ли вы опускались на дно /usr/bin современного дистрибутива
# Linux? Я несколько раз порывался это сделать, может время пришло. Вам будет
# интересно прочитать об этом? Также прикладываю статью об инструментах Linux,
# которые точно использовать не надо, срок их службы истёк.
kibb
Даже не упомянуть ksh.