Почему в Unix-подобных системах есть несколько оболочек?

16

Я только начал изучать основы Unix и удивляться, почему в Unix-подобных системах так много оболочек. Из книги Расширенное программирование в среде Unix :

Оболочка - это интерпретатор командной строки, который читает пользовательский ввод и выполняет команды. Обычно пользовательский ввод в оболочку осуществляется с терминала (интерактивная оболочка) или иногда из файла (называемого сценарием оболочки).

А затем в книге перечисляется ряд программ оболочки, таких как оболочка Bourne, оболочка Bourne-again, Cshell и т. Д. Мой вопрос в основном, почему нам нужно несколько оболочек?

Компьютерщик
источник
4
По той же причине, что существует множество стандартов для различных других технологий. xkcd.com/927
Дэн
1
По той же причине, по которой вы можете иметь компиляторы / интерпретаторы для нескольких языков программирования (также несколько компиляторов для одного языка) или нескольких интернет-браузеров.
Миша Арефьев
6
Ваш вопрос является предположительным. « Зачем нам нужно несколько оболочек? » Кто сказал вам, что нам нужно несколько оболочек? В вашей книге сказано, что у нас есть несколько оболочек. Это не одно и то же.
Роб

Ответы:

15

Большинство оболочек, используемых в современных средах UNIX, должны соответствовать спецификации POSIX sh. POSIX sh является производным от исходной оболочки Korn (ksh88), которая, в свою очередь, является производной от более ранней оболочки Bourne, но POSIX sh указывает только небольшое подмножество функциональных возможностей даже ksh88. В оболочке, которая реализует только минимальные требования, отсутствуют многие функции, необходимые для написания всех, кроме самых простых сценариев, безопасным и разумным способом. Например, локальные переменные и массивы являются нестандартными дополнениями.

Поэтому первая причина - расширить оболочку дополнительными функциями. Различные оболочки предпочитают фокусироваться на разных вещах. Например, Zsh фокусируется на расширенных интерактивных функциях, а ksh93 (текущая «оригинальная» оболочка korn) - на мощных функциях программирования и производительности. Даже очень минимальные оболочки, такие как Dash, добавляют по крайней мере несколько нестандартных дополнений, таких как локальные переменные.

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

Вторая причина - наследие. Есть еще много проприетарных Unix, которые используют древние нестандартные реализации для своих / bin / sh. До недавнего времени Solaris все еще использовал Bourne в качестве дефолта и предпочитал поддерживать оболочку Heirloom, а не обновлять ее до чего-то современного. Эти системы обычно поставляются с разными оболочками, на которые вы можете переключиться, например, путем изменения переменной PATH или изменения shebang в отдельных скриптах.

Итак, подведем итог. Есть несколько оболочек, часто по умолчанию:

  • Для дополнительных функций, особенно для работы с непереносимыми дополнениями.
  • Для обработки устаревших сценариев, которые часто не поддерживаются.
  • размер / производительность. Встраиваемые системы часто требуют небольших оболочек, таких как mksh или busybox sh.
  • Лицензионные причины. AT & T ksh была проприетарным программным обеспечением до 2000 года или около того. Это во многом то, что породило все кш-подобные клоны, такие как Zsh и Bash.
  • Другие исторические причины. Хотя сегодня это не очень популярно, предпринимались радикальные попытки изменить язык, такие как scsh и es. Подстановка процесса во многих оболочках изначально происходит от rc (с немного другим синтаксисом), а расширение скобок - от csh. Различные оболочки имеют различные комбинации таких функций, обычно с некоторыми тонкими или не очень тонкими различиями.
ormaaj
источник
2
Обратите внимание, что хотя localэто не POSIX или Unix, это указано и требуется в стандарте Linux (LSB) и стандарте политики debian . Обратите внимание, что esэто продолжение rc.
Стефан Шазелас
1
То, что в настоящее время mkshвозникло как Public Domain Bourne Shell, также было написано по причинам лицензирования. (Эти проблемы все еще остаются - лицензирование, переносимость и размер были тремя факторами, которые помогли мне убедить Google включить mksh с Android.)
mirabilos
19

Потому что у людей разные потребности, и хорошо иметь альтернативы, соответствующие вашим потребностям в данной ситуации. Оболочка - это просто инструмент сам по себе и должен быть заменен любым другим, по моему мнению. Это сила Unix / Linux, в отличие от того, что Microsoft Windows выбрала.

Точно так же ... Почему так много текстовых редакторов? Почему люди разрабатывают новый браузер, если он уже есть? Почему есть GNOME, KDE, Xfce, LXDE, E17 и т. Д.?

gertvdijk
источник
12
Точно. Кто-то может спросить "почему так много оконных менеджеров?" также. Натив Unix может задать противоположный вопрос: почему только один CMD.EXE? Почему Windows такая жесткая и не настраиваемая?
Брюс Эдигер
1
@BruceEdiger Что вы имеете в виду, только один cmd.exe? Есть альтернативы этому, если вы хотите их использовать. Даже у Microsoft есть PowerShell в качестве альтернативы.
Малкольм
3
Даже COMMAND.COMв DOS был заменяемым. Тем не менее, вы часто получаете очень хрупкую систему из-за предположений других приложений (и других пользователей). В результате есть несколько успешных альтернатив CMD.EXE. Одним из них является PowerShell, который по инерции поддерживает Microsoft. Другой пример, как ни странно, bashиз-за достойной поддержки со стороны сообщества Cygwin, не говоря уже о людях MinGW. Что касается оконных менеджеров, то в Windows их было по одному, но с течением времени их было несколько.
RBerteig
+1 за этот ответ. Я думаю, именно поэтому у нас так много разных вариантов UNIX: AIX, HP-UX, Solaris, Tru64, IRIX, UnixWare, OS X, Linux, FreeBSD, NetBSD, OpenBSD, ..., вы называете это!
Тонга
4

Короткий ответ

Из-за странной истории лицензирования ни один объект не разработал Unix. Это был процесс сообщества, в котором приняли участие как добровольцы, так и корпорации. Эти сущности не всегда разделяли все свои инструменты, поэтому произошли отдельные оболочки. К тому времени, когда мы поняли, насколько это контрпродуктивно, было уже слишком поздно объединять все используемые оболочки. Вместо этого была проделана работа по обеспечению того, чтобы все эти оболочки были (теоретически) совместимы друг с другом .

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

rahmu
источник
2

Различные оболочки существуют по тем же причинам, что и разные веб-браузеры: у каждого есть предпочтения, а у некоторых оболочек есть исторический багаж или импульс. Каждый из них имеет свои особенности и особенности.

dotancohen
источник
1

В основном история ...

Bourne был разработан как часть (проприетарного) SysV Unix, в то время как BSD использовала csh... Позже bash был разработан как альтернатива оболочке Bourne с открытым исходным кодом (и ее улучшенные версии, такие как ksh). Борновидная оболочка была принята в стандарте POSIX. ksh соответствует требованиям, а bash может соответствовать требованиям.

Оболочки, как cshи tcshнамного проще в использовании в интерактивном режиме, чем оригинальная оболочка Bourne (в которой не хватает завершения команд и т. Д.), Но ужасны для сценариев ...

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

Для переносимых сценариев вы должны использовать POSIX-совместимый вариант Bourne и избегать расширений.

Герт ван ден Берг
источник
3
-1 за то, что думал, что мир начался с SysV. Bourne оболочки был выпущен в UNIX V7 в 1977 году, за шесть лет до SysV был освобожден.
Роб
@Rob, с / +1977 / +1979 /
Stéphane Chazelas
Достаточно справедливо ... История * nix довольно сложна ... См. En.wikipedia.org/wiki/File:Unix_history-simple.svg
Герт ван ден Берг