Dicho esto, el shell Korn, como algo distinto del shell POSIX, nunca se hizo realmente popular fuera del mundo comercial de Unix. Esto se debe a que su ascenso correspondió con los primeros años de comercialización de Unix, por lo que quedó atrapado en las guerras de Unix . BSD Unixes lo evitó a favor del shell C, y su código fuente no estaba disponible para su uso gratuito en Linux cuando comenzó. Por lo general, eligen GNU Bash , uno de esos sh
-compatibles de los que estás hablando.
Esa asociación temprana entre Linux y Bash prácticamente selló el destino de muchos otros shells, incluidos ksh
, csh
y tcsh
. Hoy en día, todavía hay personas que usan esos proyectiles, pero son muy minoritarios.
Toda esta historia explica por qué a los creadores de los recién llegados relativamente les gusta bash
, zsh
y yash
decidieron hacerlos sh
compatibles: la compatibilidad Bourne / POSIX es lo mínimo que debe proporcionar un shell para sistemas similares a Unix para obtener una adopción generalizada.
Usé "script de shell" arriba como un término genérico que significa scripts de shell Bourne / POSIX. Esto se debe a la ubicuidad de las conchas de la familia Bourne. Para hablar sobre secuencias de comandos en otros shells, debe dar un calificador, como "Script de shell C". Incluso en sistemas donde un shell de la familia C es el shell interactivo predeterminado, es mejor usar el shell Bourne para las secuencias de comandos.
Hay muchas maneras de verificar si un script de shell de la familia Bourne es portátil:
Las primeras versiones de BSD Unix eran solo colecciones de software adicionales para V6 Unix. Dado que el shell Bourne no se agregó a AT&T Unix hasta V7, BSD técnicamente no comenzó a tener el shell Bourne. La respuesta de BSD a la naturaleza primitiva del shell Thompson era el shell C .
Sin embargo, las primeras versiones independientes de BSD (2.9BSD y 3BSD) se basaron en V7 o su sucesor portátil UNIX / 32V , por lo que incluyeron el shell Bourne.
(La línea 2BSD se convirtió en una bifurcación paralela de BSD para las minicomputadoras PDP de Digital , mientras que las líneas 3BSD y 4BSD aprovecharon los tipos de computadora más nuevos como las estaciones de trabajo Vaxen y Unix . 2.9BSD era esencialmente la versión PDP de 4.1cBSD; eran y código compartido contemporánea . PDP no desaparecen cuando el VAX llegó, por lo que la línea de 2BSD se sigue arrastrando los pies a lo largo ).
Es seguro decir que el shell Bourne estaba en todas partes del mundo Unix en 1983. Esa es una buena aproximación a "para siempre" en la industria informática. MS-DOS obtuvo un sistema de archivos jerárquico ese año (¡awww, qué lindo!) Y el primer Macintosh de 24 bits con su pantalla de 9 "en blanco y negro , no en escala de grises, literalmente en blanco y negro , no saldría hasta principios del próximo año.
El caparazón de Thompson era bastante primitivo para los estándares actuales. Era solo un shell de comandos interactivo, en lugar del entorno de programación de script que esperamos hoy. Tenía cosas como tuberías y redirección de E / S, que consideramos como parte prototípica de un "shell de Unix", por lo que pensamos en el shell de comandos de MS-DOS como obteniéndolos de Unix.
El shell Bourne también reemplazó al shell PWB , que agregó cosas importantes al shell Thompson como la capacidad de programación ( if
, switch
y while
) y una forma temprana de variables de entorno. El shell PWB es aún menos recordado que el shell Thompson, ya que no formaba parte de todas las versiones de Unix.
Cuando alguien no es específico acerca de la compatibilidad de shell POSIX vs Bourne, hay una gran variedad de cosas que podrían significar.
En un extremo, podrían estar usando el shell Bourne de 1979 como línea de base. Una " sh
secuencia de comandos compatible" en este sentido significaría que se espera que funcione perfectamente en el verdadero shell Bourne o cualquiera de sus sucesores y clones: ash
, bash
, ksh
, zsh
, etc.
Alguien en el otro extremo asume el shell especificado por POSIX como una línea de base. Tomamos tantas características de shell POSIX como "estándar" en estos días que a menudo olvidamos que en realidad no estaban presentes en el shell Bourne: aritmética incorporada, control de trabajos, historial de comandos, alias, edición de línea de comandos, la $()
forma de comando sustitución, etc.
Aunque el shell Korn tiene raíces que se remontan a principios de la década de 1980, AT&T no lo envió en Unix hasta System V Release 4 en 1988. Dado que muchos Unix comerciales se basan en SVR4, esto incluyó ksh
casi todos los Unix comerciales relevantes de finales de 1980 en adelante.
(Algunos sabores extraños de Unix basados en SVR3 y anteriores se mantuvieron en piezas del mercado después del lanzamiento de SVR4, pero fueron los primeros contra la pared cuando llegó la revolución ).
1988 es también el año en que salió el primer estándar POSIX , con su "shell POSIX" basado en Korn shell. Más tarde, en 1993, salió una versión mejorada del shell Korn. Desde POSIX efectivamente clavado el original en su lugar, ksh
bifurcado en dos versiones principales: ksh88
y ksh93
, nombrado después de los años involucrados en su división.
ksh88
no es totalmente compatible con POSIX, aunque las diferencias son pequeñas, por lo que algunas versiones del ksh88
shell se parchearon para ser compatibles con POSIX. (Esto es de una entrevista interesante en Slashdot con el Dr. David G. Korn . Sí, el tipo que escribió la concha).
ksh93
es un superconjunto totalmente compatible del shell POSIX . El desarrollo en ksh93
ha sido esporádico desde que el repositorio de la fuente primaria se mudó de AT&T a GitHub con el lanzamiento más reciente de aproximadamente 3 años cuando escribo esto, ksh93v. (El nombre base del proyecto permanece ksh93
con sufijos agregados para denotar versiones de lanzamiento más allá de 1993).
Los sistemas que incluyen un shell Korn como algo separado del shell POSIX generalmente lo hacen disponible /bin/ksh
, aunque a veces se esconde en otro lugar.
Cuando hablamos sobre ksh
el shell Korn por su nombre, estamos hablando de ksh93
características que lo distinguen de sus subconjuntos de shell Bourne y POSIX compatibles con versiones anteriores. Raramente te encuentras con lo puro ksh88
hoy.
AT&T mantuvo el código fuente del shell Korn propietario hasta marzo de 2000 . En ese momento, la asociación de Linux con GNU Bash era muy fuerte. Bash y ksh93
cada uno tienen ventajas sobre el otro , pero en este punto la inercia mantiene a Linux estrechamente asociado con Bash.
En cuanto a por qué los primeros proveedores de Linux eligen más comúnmente GNU Bash pdksh
, que estaba disponible en el momento en que Linux comenzaba, supongo que es porque gran parte del resto de la tierra de usuarios también provino del proyecto GNU . Bash también es algo más avanzado que pdksh
, ya que los desarrolladores de Bash no se limitan a copiar las características del shell Korn.
El trabajo se pdksh
detuvo aproximadamente cuando AT&T lanzó el código fuente al verdadero shell Korn. Hay dos horquillas principales que se siguen manteniendo, sin embargo: la OpenBSD pdksh
y el Korn Shell MirBSD,mksh
.
Me parece interesante que mksh
sea la única implementación de shell Korn actualmente empaquetada para Cygwin.
GNU Bash va más allá de POSIX de muchas maneras, pero puede pedirle que se ejecute en un modo POSIX más puro .
csh
/ tcsh
solía ser el shell interactivo predeterminado en BSD Unixes a principios de los 90
Siendo una variante BSD , las primeras versiones de Mac OS X fueron así, a través de Mac OS X 10.2 "Jaguar" . OS X cambió el shell predeterminado de tcsh
Bash en OS X 10.3 "Panther" . Este cambio no afectó a los sistemas actualizados desde 10.2 o anteriores. Los usuarios existentes en esos sistemas convertidos mantuvieron su tcsh
shell.
FreeBSD afirma que todavía se usa tcsh
como shell predeterminado , pero en el FreeBSD 10 VM que tengo aquí, el shell predeterminado parece ser una de las variantes de shell Almquist compatibles con POSIX . Esto también es cierto en NetBSD.
OpenBSD usa una bifurcación pdksh
como shell predeterminado en su lugar.
La mayor popularidad de Linux y OS X hace que algunas personas deseen que FreeBSD también cambie a Bash, pero no lo harán pronto por razones filosóficas . Es fácil cambiarlo , si esto te molesta.
Es raro encontrar un sistema con un shell Bourne verdaderamente vainilla como en /bin/sh
estos días. Tienes que salir de tu camino para encontrar algo lo suficientemente cerca para pruebas de compatibilidad.
Solo conozco una forma de ejecutar un auténtico Bourne shell de 1979 en una computadora moderna: use las imágenes de disco de Ancient Unix V7 con el simulador SIMH PDP-11 del Proyecto de simulación de historia de computadora . SIMH se ejecuta en casi todas las computadoras modernas , no solo en las Unix. SIMH incluso se ejecuta en Android y en iOS .
Con OpenSolaris , Sun abrió por primera vez la versión SVR4 del shell Bourne. Antes de eso, el código fuente para las versiones posteriores a V7 del shell Bourne solo estaba disponible para aquellos con una licencia de código fuente Unix.
Ese código ahora está disponible por separado del resto del difunto proyecto OpenSolaris de un par de fuentes diferentes.
La fuente más directa es el proyecto de shell Heirloom Bourne . Esto estuvo disponible poco después del lanzamiento original de 2005 de OpenSolaris. Algunos trabajos de portabilidad y corrección de errores se realizaron en los próximos meses, pero luego el desarrollo del proyecto se detuvo.
Jörg Schilling ha hecho un mejor trabajo al mantener una versión de este código como osh
en su paquete Schily Tools . Ver arriba para más información sobre esto.
Tenga en cuenta que estos shells derivados de la versión del código fuente de 2005 contienen compatibilidad con conjuntos de caracteres de varios bytes , control de trabajos, funciones de shell y otras características que no están presentes en el shell Bourne original de 1979.
Una forma de saber si está en un shell Bourne original es ver si admite una función no documentada agregada para facilitar la transición desde el shell Thompson: ^
como un alias para |
. Es decir, un comando como ls ^ more
dará un error en un shell de tipo Korn o POSIX, pero se comportará como ls | more
en un shell Bourne verdadero.
De vez en cuando te encuentras con un fish
, scsh
o rc/es
adherente, pero son aún más raros que los fanáticos de C.
La rc
familia de los shells no se usa comúnmente en los sistemas Unix / Linux, pero la familia es históricamente importante, y así es como se ganó un lugar en el diagrama anterior. rc
es la cáscara estándar del Plan 9 del sistema operativo Bell Labs , una especie de sucesor de la décima edición de Unix , creada como parte de la investigación continua de Bell Labs en el diseño del sistema operativo. Es incompatible con Bourne y C shell a nivel de programación; Probablemente hay una lección allí.
La variante más activa de rc
parece ser la mantenida por Toby Goodwin , que se basa en el rc
clon Unix de Byron Rakitzis.
sh
). Para un shell diferente, se refiere a si ese shell puede ejecutar scripts de shell Bourne.