Большинство оболочек, используемых в современных средах 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. Различные оболочки имеют различные комбинации таких функций, обычно с некоторыми тонкими или не очень тонкими различиями.