La mayoría de los shells utilizados en entornos UNIX modernos están destinados a cumplir con la especificación POSIX sh. POSIX sh se deriva del shell Korn original (ksh88), que a su vez se deriva del shell Bourne anterior, pero POSIX sh solo especifica un pequeño subconjunto de incluso la funcionalidad de ksh88. A un shell que solo implementa el requisito mínimo le faltan muchas características requeridas para escribir todos los scripts menos los más triviales de una manera segura y razonable. Por ejemplo, las variables locales y las matrices son extras no estándar.
Por lo tanto, la primera razón es extender el shell con características adicionales. Las diferentes conchas eligen enfocarse en diferentes cosas. Por ejemplo, Zsh se enfoca en características interactivas avanzadas mientras que ksh93 (el shell korn "original" actual) se enfoca en potentes características de programación y rendimiento. Incluso los shells muy mínimos como Dash agregan al menos algunos extras no estándar como las variables locales.
Las características adicionales rara vez son ampliamente interoperables, si es que lo hacen. La mayor parte del conjunto de características ksh88 es bastante interoperable, como la sintaxis de globbing extendida, pero con características no estándar, no hay garantías, y realmente debe saber qué está haciendo para usarlas de forma portátil.
La segunda razón es el legado. Todavía hay muchos Unix patentados que usan implementaciones antiguas no estándar para su / bin / sh. Hasta hace poco, Solaris todavía usaba Bourne como su defuault y eligió mantener el shell Heirloom en lugar de actualizarse a algo moderno. Estos sistemas generalmente vienen con diferentes shells a los que puede cambiar, por ejemplo, cambiando su variable PATH o alterando shebangs dentro de scripts individuales.
Entonces para resumir. Hay múltiples shells, a menudo por defecto:
- Para características adicionales, especialmente para tratar con extras no portátiles.
- Para manejar scripts heredados que a menudo no se mantienen.
- Tamaño / rendimiento. Los sistemas integrados a menudo requieren pequeños shells como mksh u busybox sh.
- Razones de licencia. AT&T ksh fue un software propietario hasta alrededor de 2000 más o menos. Esto es en gran medida lo que dio lugar a todos los clones similares a ksh como Zsh y Bash.
- Otras razones históricas. Aunque hoy no es muy popular, ha habido intentos radicales de rediseñar el lenguaje, como scsh y es. La función de sustitución de proceso de muchos shells proviene originalmente de rc (con una sintaxis un poco diferente) y la expansión de llaves de csh. Diferentes shells tienen diferentes combinaciones de tales características disponibles, generalmente con algunas diferencias sutiles o no tan sutiles.