Bourne shell¶
Bourne shell (sh) — это командная оболочка (интерпретатор команд) для операционных систем семейства Unix, разработанная Стивеном Борном в Bell Labs в 1977 году. Она стала первой стандартной оболочкой Unix, заменив более раннюю оболочку Томпсона (Thompson shell), и заложила основы синтаксиса и функциональности, которые используются в большинстве современных командных оболочек, включая Bash, KornShell и Zsh. Bourne shell является частью спецификации POSIX, что обеспечивает переносимость сценариев между различными Unix-подобными системами.
¶История
¶Предпосылки создания
В начале 1970-х годов в операционной системе Unix использовалась командная оболочка, разработанная Кеном Томпсоном (Thompson shell). Она предоставляла базовые возможности для запуска команд и перенаправления ввода-вывода, но имела существенные ограничения: отсутствие поддержки сценариев (скриптов) в современном понимании, ограниченные возможности управления потоком выполнения (например, отсутствие циклов и условных операторов) и неудобный синтаксис для перенаправления.
¶Разработка Стивеном Борном
Стивен Борн, работавший в Bell Labs, поставил перед собой задачу создать более мощную и гибкую оболочку, которая могла бы использоваться как для интерактивной работы, так и для написания сценариев. Разработка велась на языке C. Первая версия Bourne shell была выпущена в 1977 году в составе седьмой версии Unix (V7). Ключевыми нововведениями стали:
- Полноценный язык сценариев с поддержкой переменных, циклов (
for,while), условных операторов (if,case), функций и арифметических выражений. - Механизм перенаправления ввода-вывода с использованием дескрипторов файлов (например,
2>&1для перенаправления stderr в stdout). - Возможность запуска фоновых процессов с помощью символа
&. - Поддержка heredoc (здесь-документов) для передачи многострочного текста в команды.
¶Распространение и влияние
Bourne shell быстро стал стандартной оболочкой в большинстве коммерческих версий Unix, включая System V от AT&T. Его синтаксис и семантика были приняты за основу при разработке более поздних оболочек. В 1989 году Брайан Фокс создал Bourne Again SHell (Bash), которая расширила возможности sh, добавив функции из KornShell и C shell, но сохранила обратную совместимость. Bourne shell также является основой для POSIX-совместимых оболочек, таких как dash (Debian Almquist shell), используемая в некоторых дистрибутивах Linux для ускорения загрузки.
¶Архитектура и принцип работы
¶Основные компоненты
Bourne shell работает как интерпретатор команд, считывая строки из стандартного ввода (клавиатура, файл, конвейер) и выполняя их. Ключевые компоненты:
- Парсер: разбирает введённую строку на токены (команды, аргументы, операторы).
- Исполнитель: запускает команды, управляет перенаправлением ввода-вывода и конвейерами.
- Встроенные команды: реализованы непосредственно в коде оболочки (например,
cd,echo,exec,exit,export,read,test), что позволяет выполнять их без запуска внешнего процесса. - Управление заданиями: позволяет запускать команды в фоне (
&), приостанавливать (Ctrl+Z) и возобновлять (fg,bg).
¶Синтаксис и основные конструкции
Синтаксис Bourne shell отличается лаконичностью и строгостью. Ключевые элементы:
- Переменные: определяются без знака
$(например,var=value), а для обращения к значению используется$varили${var}. - Условные операторы:
if command; then ...; fi,case word in pattern) ...;; esac. Командаtest(или[ ]) используется для проверки условий. - Циклы:
for var in list; do ...; done,while command; do ...; done,until command; do ...; done. - Функции: определяются как
funcname() { ...; }. - Перенаправление:
>(перезапись),>>(добавление),<(чтение),2>(перенаправление stderr),&>(перенаправление stdout и stderr). - Конвейеры:
command1 | command2передаёт вывод первой команды на ввод второй. - Подстановка команд:
$(command)или `command` (устаревшая форма) для использования вывода команды как аргумента.
¶Обработка ошибок
Bourne shell не имеет встроенной обработки исключений. Ошибки обычно приводят к завершению сценария с ненулевым кодом возврата. Для проверки успешности выполнения используется конструкция if command; then ...; else ...; fi или оператор || (выполнить следующую команду, если предыдущая завершилась с ошибкой).
¶Классификация и варианты
¶Основные версии
- Оригинальный Bourne shell (sh): версия из V7 Unix. В настоящее время практически не используется в чистом виде.
- POSIX sh: стандартизированная версия, определённая в спецификации POSIX.1-2001. Обеспечивает переносимость сценариев между различными Unix-подобными системами.
- Dash (Debian Almquist shell): быстрая и лёгкая реализация POSIX-совместимой оболочки, используемая в Debian и Ubuntu в качестве
/bin/shдля ускорения загрузки системы. - Bash (Bourne Again SHell): расширенная версия, совместимая с sh, но добавляющая множество функций (например, массивы, арифметические выражения, автодополнение). В большинстве дистрибутивов Linux
/bin/shявляется символической ссылкой на Bash или Dash. - KornShell (ksh): разработана Дэвидом Корном в AT&T, включает возможности sh и C shell, а также дополнительные функции для программирования.
¶Отличия от других оболочек
- От C shell (csh): Bourne shell использует синтаксис, основанный на ключевых словах и операторах, в то время как C shell заимствует синтаксис языка C. Bourne shell более строг в отношении пробелов и кавычек.
- От Bash: Bash является надмножеством sh, то есть любой сценарий sh будет работать в Bash, но не наоборот. Bash добавляет такие возможности, как массивы, арифметические вычисления, подстановка процессов, автодополнение и расширенное управление историей команд.
¶Применение
¶Системное администрирование
Bourne shell и его производные (Bash, Dash) являются основным инструментом для написания сценариев автоматизации в Unix-подобных системах. С их помощью выполняются:
- Запуск и остановка служб (init-скрипты, systemd unit-файлы).
- Резервное копирование и восстановление данных.
- Мониторинг системы (проверка дискового пространства, загрузки процессора).
- Управление пользователями и правами доступа.
- Развёртывание программного обеспечения.
¶Разработка программного обеспечения
Сценарии на Bourne shell используются для:
- Сборки проектов (Makefile-ы часто вызывают sh-скрипты).
- Тестирования (автоматизированные тесты, запускаемые в CI/CD-пайплайнах).
- Развёртывания приложений на серверах.
- Обработки данных (конвейеры из команд, работа с текстовыми файлами).
¶Интерактивная работа
Хотя Bourne shell в чистом виде редко используется для интерактивной работы (из-за отсутствия автодополнения и редактирования командной строки), его синтаксис является основой для большинства современных оболочек. Пользователи Bash, Zsh или ksh фактически работают с расширенной версией sh.
¶Критика и ограничения
¶Недостатки
- Синтаксис: некоторые конструкции (например,
testи[ ]) считаются неинтуитивными и подвержены ошибкам, особенно при работе с пробелами и специальными символами. - Отсутствие структур данных: Bourne shell не поддерживает массивы, хеш-таблицы или другие сложные структуры данных, что затрудняет написание сложных сценариев.
- Обработка ошибок: отсутствие встроенной обработки исключений и ограниченные возможности отладки делают разработку крупных сценариев трудоёмкой.
- Производительность: интерпретация сценариев может быть медленной по сравнению с компилируемыми языками, особенно при выполнении большого количества внешних команд.
¶Альтернативы
Для задач, требующих сложной логики или высокой производительности, часто используются языки программирования более высокого уровня, такие как Python, Perl или Ruby. Однако для простых задач автоматизации и системного администрирования Bourne shell остаётся незаменимым инструментом благодаря своей простоте, доступности и переносимости.
¶Интересные факты
- Название «Bourne shell» происходит от фамилии автора, Стивена Борна. Игра слов: «bourne» в английском языке означает «ручей» или «граница», что также обыгрывается в названии Bourne Again SHell (Bash).
- Bourne shell был первой оболочкой, которая поддерживала heredoc, что позволило удобно передавать многострочные данные в сценарии.
- В оригинальной версии Bourne shell не было поддержки истории команд и редактирования командной строки — эти функции были добавлены в более поздних оболочках.
- Стивен Борн также известен своей работой в области алгоритмов и теории вычислительных машин, в частности, как соавтор алгоритма Борна — Аггара — Шура.
¶Источники
- Стивен Борн. «The Unix Shell». Bell Laboratories, 1977.
- Брайан У. Керниган, Роб Пайк. «Unix. Программное окружение». Addison-Wesley, 1984.
- Спецификация POSIX.1-2001, раздел «Shell Command Language».
- Документация GNU Bash (Bourne Again SHell).
- Статья «Bourne shell» в Википедии (английская версия).
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →

