La respuesta corta a "por qué el shell sh original no está presente sh
" es que no hay sh original.
Bueno, está bien: es el caparazón de Thompson . La versión 1 tenía algunas de las características que conocemos hoy, en particular la redirección y las canalizaciones (lea el documento de Dennis Ritchie sobre la historia temprana de Unix ). Las versiones posteriores agregaron características tales como ejecución en segundo plano &
, globbing (implementado con un programa externo) y algunas formas de citas, pero no tenía variables ni estructuras de control anidadas. Las condiciones y los bucles se proporcionaron a través de programas externos if
(que tomaban una condición y un comando como argumentos) y goto
(que funcionaba cambiando la posición del archivo de su padre en el archivo de script).
En 1979, en Unix V7 , el shell Thompson fue reemplazado /bin/sh
por el shell Bourne . La primera versión ya tenía muchas de las características que están presentes en el tablero hoy, y las versiones posteriores introdujeron muchas más . Unos años más tarde, el caparazón de Korn entró en escena, con un conjunto de características cada vez mayor; muchas variantes de Unix lo instalaron bajo el nombre ksh
.
En 1992, POSIX codificó un conjunto mínimo de sh
características que era básicamente Bourne más algunas cosas. Cualquier sistema que se llamara a sí mismo "Unix" tenía que implementar al menos estas características. Los sistemas comerciales de Unix generalmente usaban ksh como POSIX sh, pero algunos (por ejemplo, OSF / 1 ) tenían el suyo.
Ni el shell Bourne ni el shell Korn eran de código abierto hasta hace relativamente poco, así que cuando el mundo Linux comenzó a formarse a mediados de la década de 1990, no estaban disponibles. /bin/sh
Tenía que ser otra cosa. La mayoría de las distribuciones de Linux fueron para bash , un shell del proyecto GNU que tendía a estar entre Bourne y Korn en términos de funciones de secuencias de comandos, y mucho mejor que cualquiera de ellas para uso interactivo). La única alternativa viable era pdksh ("dominio de Korn de dominio público"), una versión gratuita (ahora descontinuada, pero que vive como mksh , que está desarrollada activamente ), pero no recuerdo una distribución de Linux usando pdksh como/bin/sh
, No sé por qué, supongo que porque las distribuciones de Linux siempre fueron distribuciones de GNU / Linux, básicamente enviaban versiones de GNU de cualquier herramienta para la que existía una versión de GNU.
También hubo varias implementaciones de código abierto de sh
llamadas "cenizas", especialmente el shell Almquist , pero eran muy incompletas, carecían de algunas características POSIX que la gente quería usar. Un programador que era mantenedor de Debian, Herbert Xu , extendió ash para que fuera compatible con POSIX. Finalmente, su versión cambió su nombre a dash, y hubo algún impulso para hacerlo /bin/sh
en Debian en lugar de bash. Ubuntu comenzó antes de que Debian comenzara a tratar sistemáticamente los basismos (el uso de la funcionalidad específica de bash en los #!/bin/sh
scripts) como errores . Ambos cambiaron más tarde ( Ubuntu 6.10 , Debian solo en 2009 ( era un objetivo para lenny pero el cambio solo se realizó después de la liberación de lenny, es decir, en compresión)).
Una de las principales razones para el uso de guión como lugar de fiesta como /bin/sh
es que es mucho más rápido. Esto fue especialmente importante para Ubuntu, que se ha esforzado por mantener cortos los tiempos de arranque desde el principio. Dash también tiende a usar menos memoria que bash, lo cual es algo importante para los scripts de envoltura que se quedan solo para hacer un poco de limpieza cuando sale del programa subyacente. Otro beneficio de dash es que solo se basa en libc (la biblioteca central del sistema), mientras que bash también se basa en bibliotecas de soporte de terminal (no puede comenzar sin ellas, incluso para ejecutar un script); Esto significa que el tablero tiene una mejor oportunidad de seguir trabajando en un sistema dañado.
En algún momento durante el siglo XXI, el shell Korn se convirtió en código abierto y aparecieron versiones de código abierto del shell Bourne (versiones antiguas, porque el desarrollo había cesado años antes). Pero dash y bash estaban demasiado arraigados en el mundo de Linux para que pudieran ganar aceptación, especialmente el shell Bourne, ya que su valor hoy en día es solo histórico. Dash desplazó a Bash porque tenía claros beneficios, pero ninguno de los otros contendientes tiene una ventaja decisiva /bin/sh
.
system
(3) que hacen las aplicaciones) ese es el factor dominante.La velocidad y el cumplimiento de POSIX (en otras palabras, portabilidad) son los factores principales. Recuerde que
/bin/sh
está destinado a los scripts del sistema, que pueden o no provenir de versiones anteriores de Ubuntu y / u otros sistemas.Claro, las características brillantes de
bash
son geniales para usar para los usuarios de nosotros, pero cuando se trata de ejecutar cosas en un entorno en el que tiene que administrar varios servidores / sistemas diferentes, tener un shell compatible con POSIX marca una gran diferencia. Especialmente, si eres un nuevo administrador de sistemas y un entorno heredado con muchos scripts.En cuanto a por qué el shell Bourne original no está presente, es simple: es un producto patentado originalmente propiedad de AT&T Bell Labs.
Además, en realidad hay una explicación explícita en el wiki de Ubuntu sobre eso:
Y aquí hay una nota sobre portabilidad:
Ver https://wiki.ubuntu.com/DashAsBinSh
fuente
dash
admite funciones que no son requeridas porPOSIX
?En las distribuciones de GNU / Linux, el "original
/bin/sh
" es en realidad Bash.GNU quería un shell tipo Bourne que estuviera bajo la GPL, por eso eligieron Bash para ellos
/bin/sh
, en lugar de Bourne, que no tenía licencia GPL. Las distribuciones modernas de Linux heredaron esta decisión hasta el punto de que se convirtió en un estándar de facto para/bin/sh
ser Bash. El shell Bourne original ("sh") se ha utilizado en otros Unix no Linux, incluso recientemente como Solaris 10, pero nunca ha sido un pilar en las distribuciones de Linux.Cambiar
/bin/sh
de bash a dash fue una decisión de Debian (heredada por Ubuntu) motivada en gran medida por la velocidad: llegó en un momento en que pusieron un gran esfuerzo en mejorar la velocidad de arranque, y una gran parte del tiempo de arranque de la CPU en el momento consistente de la ejecución guiones de inicio.Bash continúa siendo utilizado como el shell interactivo / inicio de sesión predeterminado para los usuarios, pero Dash es el
/bin/sh
que se ejecuta en y para los scripts del sistema, como los scripts de inicio.Dash es muy rápido, pero también es muy compatible con POSIX, un estándar que se alinea estrechamente con el shell Bourne. Entonces, de alguna manera, al cambiar de Bash a Dash, volvemos a un shell más estrechamente alineado con Bourne.
fuente
ksh
, diría yo. No recuerdo que el shell Bourne tenga expansión aritmética `$ (())`, que es POSIX.^
es un carácter de tubería, por lo queecho foo ^ cat
se emitiráfoo ^ cat
en POSIX sh, perofoo
en Bourne; Esta prueba específica es cómo Autoconf distingue a los dos./bin/sh
está vinculado a/bin/dash
lo que creo son razones de compatibilidad. Muchos guiones simplemente comienzan conasí que al pasar
dash
y no hacer un enlace simbólico, muchos scripts no se ejecutarían correctamente (o no se ejecutarían) si/bin/sh
no existieran en absoluto.El cambio se realizó desde
bash
adash
porque según https://wiki.ubuntu.com/DashAsBinSh :sh
no está vinculado abash
, porqueSi quieres usar
bash
como/bin/sh
:Hay algunas características que
dash
proporcionan que bash no, como:fuente
sh
a/bin/sh
, haría este tornillo hasta los guiones de arranque?/bin/sh
como el shell proporcionado por la distribución, ya que eso es a lo que se han dirigido con sus scripts de arranque y similares. Pero si lo reemplazaras con Bourne, sería sobre todo compatible. Sin embargo, me imagino que habría roturas, solo debido a pequeñas diferencias frente a la gran cantidad de código. Por supuesto, puede usar cualquier shell en sus propios scripts con un hashbang personalizado./bin/sh
al que se vincula está separado del que un usuario en particular ha establecido como su shell de inicio de sesión inicial. El objetivo de la/bin/sh
no depende de lo que el usuario está buscando, y que hacen necesario utilizarsudo
-o algún otro medio de actuar como usuario root - para cambiarlo. Además, en general y para cualquier paquete,dpkg-reconfigure
debe ejecutarse como root. En contraste, a los usuarios generalmente se les permite cambiar su propio shell de inicio de sesión inicial y pueden hacerlo con elchsh
comando. El nombre del shell de inicio de sesión inicial también se incluye$SHELL
y también se utiliza para algunos shells interactivos sin inicio de sesión.