¿Cuál es el punto de que sh esté vinculado al tablero?

36

Me pregunto cuál es el punto de shestar vinculado simbólicamente dash. Entiendo que dashse supone que es más rápido que bash, pero no estoy seguro de por qué el shshell original no está presente sh.

O, si algo, ¿por qué no está shvinculado bash?

NerdOfCode
fuente

Respuestas:

72

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/shpor 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 shcaracterí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/shTení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 shllamadas "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/shen 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/shscripts) 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/shes 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.

Gilles 'SO- deja de ser malvado'
fuente
Yo diría que hay buenas razones para usar ksh93 como / bin / sh: es uno de los shells POSIX de mayor rendimiento disponibles. Acordó que la ubicuidad del tablero es una cuestión de tiempo.
Charles Duffy
2
@CharlesDuffy Ksh93 es más rápido para hacer cosas complejas, pero el guión lo supera para el tiempo de inicio y para los scripts simples (como todas las llamadas a system(3) que hacen las aplicaciones) ese es el factor dominante.
Gilles 'SO- deja de ser malvado'
21

La velocidad y el cumplimiento de POSIX (en otras palabras, portabilidad) son los factores principales. Recuerde que /bin/shestá 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 bashson 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:

¿Por qué se hizo este cambio? La razón principal para cambiar el shell predeterminado fue la eficiencia. bash es un excelente shell con todas las funciones apropiado para uso interactivo; de hecho, sigue siendo el shell de inicio de sesión predeterminado. Sin embargo, es bastante grande y lento para iniciar y operar en comparación con el tablero. Se inicia una gran cantidad de instancias de shell como parte del proceso de arranque de Ubuntu. En lugar de cambiar cada uno de ellos individualmente para que se ejecuten explícitamente en / bin / dash, un cambio que requeriría un mantenimiento continuo significativo y que podría retroceder si no se presta mucha atención, el equipo de desarrollo central de Ubuntu consideró que era mejor simplemente cambiar El shell predeterminado. Las mejoras en la velocidad de arranque en Ubuntu 6.10 a menudo se atribuyeron incorrectamente a Upstart, que es una buena plataforma para el desarrollo futuro del sistema init pero en Ubuntu 6. 10 se estaba ejecutando principalmente en el modo de compatibilidad del Sistema V con solo pequeños cambios de comportamiento. Estas mejoras se debieron en gran medida al cambio / bin / sh.

Y aquí hay una nota sobre portabilidad:

El manual de políticas de Debian ha ordenado durante mucho tiempo que "los scripts de shell que especifiquen '/ bin / sh' como intérprete solo deben usar las funciones POSIX"; de hecho, este requisito ha estado vigente desde mucho antes del inicio del proyecto Ubuntu. Además, cualquier script de shell que se espera sea portátil a otros sistemas Unix, como los BSD o Solaris, ya cumplió con este requisito. Por lo tanto, sentimos que el impacto de compatibilidad de este cambio sería mínimo.

Ver https://wiki.ubuntu.com/DashAsBinSh

Sergiy Kolodyazhnyy
fuente
¿No dashadmite funciones que no son requeridas por POSIX?
NerdOfLinux
@NerdOfLinux Realmente no importa lo que / bin / sh admite además de POSIX (siempre y cuando esas adiciones no rompan los scripts POSIX); Lo importante es que admite todo POSIX (y es lo más rápido posible). Siempre que el guión cumpla con estos requisitos, / bin / sh puede vincularse a él.
Guntram Blohm apoya a Monica el
9

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/shser 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/shde 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/shque 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.

thomasrutter
fuente
"Dash es muy rápido, pero también es muy compatible con POSIX, un estándar que se alinea estrechamente con el shell Bourne". Sí, aunque POSIX está más estrechamente relacionado ksh, diría yo. No recuerdo que el shell Bourne tenga expansión aritmética `$ (())`, que es POSIX.
Sergiy Kolodyazhnyy
1
Además, en Bourne, ^es un carácter de tubería, por lo que echo foo ^ catse emitirá foo ^ caten POSIX sh, pero fooen Bourne; Esta prueba específica es cómo Autoconf distingue a los dos.
Charles Duffy
Interesante, entonces, ¿por POSIX sh te refieres a Korn?
thomasrutter
0

/bin/shestá vinculado a /bin/dashlo que creo son razones de compatibilidad. Muchos guiones simplemente comienzan con

#!/bin/sh

así que al pasar dashy no hacer un enlace simbólico, muchos scripts no se ejecutarían correctamente (o no se ejecutarían) si /bin/shno existieran en absoluto.

El cambio se realizó desde basha dashporque según https://wiki.ubuntu.com/DashAsBinSh :

La razón principal para cambiar el shell predeterminado fue la eficiencia. bash es un excelente shell con todas las funciones apropiado para uso interactivo; de hecho, sigue siendo el shell de inicio de sesión predeterminado. Sin embargo, es bastante grande y lento para iniciar y operar en comparación con el tablero. Se inicia una gran cantidad de instancias de shell como parte del proceso de arranque de Ubuntu. En lugar de cambiar cada uno de ellos individualmente para que se ejecuten explícitamente en / bin / dash, un cambio que requeriría un mantenimiento continuo significativo y que podría retroceder si no se presta mucha atención, el equipo de desarrollo central de Ubuntu consideró que era mejor simplemente cambiar El shell predeterminado.

shno está vinculado a bash, porque

El manual de políticas de Debian ha ordenado durante mucho tiempo que "los scripts de shell que especifiquen '/ bin / sh' como intérprete solo deben usar las funciones POSIX"

Si quieres usar bashcomo /bin/sh:

Si los problemas están más extendidos y desea volver a cambiar el shell predeterminado del sistema, puede indicarle al sistema de administración de paquetes que deje de instalar el tablero como / bin / sh:

sudo dpkg-reconfigure dash

Hay algunas características que dashproporcionan que bash no, como:

¡Incluso hay una posibilidad externa de que haya algunos scripts que ahora dependen de alguna característica del guión que bash no proporciona!

NerdOfLinux
fuente
Ya entendí que la compatibilidad puede ser un factor, pero estaba buscando una respuesta no tan obvia y más profunda ...
NerdOfCode
2
Así que si tuviera que instalar el shell Bourne original, sha /bin/sh, haría este tornillo hasta los guiones de arranque?
postre
Probablemente sea mejor probar esto en una máquina virtual primero antes de implementarlo en el mundo real ...
NerdOfCode
2
Debes dejarlo /bin/shcomo 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.
thomasrutter
1
@mckenzm El shell /bin/shal 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/shno depende de lo que el usuario está buscando, y que hacen necesario utilizar sudo-o algún otro medio de actuar como usuario root - para cambiarlo. Además, en general y para cualquier paquete, dpkg-reconfiguredebe 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 el chshcomando. El nombre del shell de inicio de sesión inicial también se incluye $SHELLy también se utiliza para algunos shells interactivos sin inicio de sesión.
Eliah Kagan