¿Qué es / bin / dash?

27

Pensé que /bin/shera un enlace simbólico a mi caparazón de elección. Siempre lo he usado bash, así que supuse que eso /bin/shseñalaría /bin/bash. Sin embargo, resulta que apunta /bin/dash.

Se pone más divertido. Comienzo dashy hago echo $SHELLy se imprime /bin/bash(¿entonces son básicamente lo mismo?). Sin embargo, la página de manual de dashes completamente diferente de la página de manual de bash(¿entonces no son lo mismo?).

aioobe
fuente
1
@wzzrd, ¿esta pregunta es específica de Linux?
aioobe
1
suspiro, no puedo votar todas estas buenas respuestas, ya que necesito 15 repeticiones. Me siento discapacitado ya que tengo 18k en stackoverflow: - /
aioobe
44
mmm dash .. ¿qué pasa con / bin / crash (para fanáticos de gdb), / bin / slash (un programa de austeridad), / bin / mash (tiempos difíciles en Corea), / bin / sash (para animadoras), / bin / thrash (duro en su HDD), / bin / flash (pero solo si encripta sus datos), / bin / stash (buena suerte al encontrarlo más tarde), / bin / cash (siempre está en el dinero), / bin / pash (romancing para PC), / bin / gash (aaargggh!).
PP.
2
@PP - Leí / bin / thrash para los fanáticos de la música Metal, y / bin / slash para los fanáticos de los guitarristas principales de la banda de rock de los 80 ...
:-P
1
La razón se echo $SHELLimprime /bin/bashporque esa variable está configurada para el shell predeterminado que comienza cuando inicia sesión en lugar del shell actual que está ejecutando. Inicie ksh o zsh desde un indicador de Bash y echo $SHELLaún dirá /bin/bash. Use pspara ver lo que se está ejecutando actualmente.
Pausado hasta nuevo aviso.

Respuestas:

43

Debian y Ubuntu cambiaron a dash (iirc) debido a un par de cosas. En primer lugar, Bash se ha vuelto grande con los años. De hecho, el /bin/bashbinario en mi sistema Ubuntu 8.04 es casi diez veces (!) Tan grande como /bin/dash. Ahora, eso no importa mucho para el uso diario de shell, pero sí importa en las siguientes situaciones:

  • Dash es mucho más pequeño y, por lo tanto, se carga más rápido, lo que es una bendición para los scripts de inicio. Si tiene que iniciar muchos de ellos, cargar Dash en lugar de Bash cada vez, acelera considerablemente las cosas.
  • Debido al tamaño más pequeño de Dash, Debian y Ubuntu pueden reducir una gran parte del tamaño de su initrd, dejando más espacio para otras cosas (y de nuevo, acelerando las cosas).

La desventaja de usar Dash en lugar de Bash para las secuencias de comandos es que muchas personas usan sutilezas sintácticas que solo Bash tiene, los llamados Bashisms . Ejemplos de Bashisms son subcadenas, como esta:

echo $SHELL
/bin/bash
a=1234567890
echo ${a}
1234567890
echo ${a:3}
4567890
echo ${a:3:1}
4

Y esto:

echo ${a#123}
4567890

Dash, por otro lado, tiene como objetivo principal ser compatible con POSIX (y no más que eso), le dará un error de mala subtición si intenta esto:

echo $SHELL
/bin/dash 
# actually, it will read /bin/bash above, because if you just run dash
# it will not set the $SHELL variable :)
a=1234567890
echo ${a}
1234567890
echo ${a:3}
dash: Bad substitution

Esto importará si usa /bin/sh(y por lo tanto dash) como intérprete para sus shellscripts y usa Bashisms en ellos. Debian y Ubuntu tienen buenas páginas wiki sobre Bashisms y por qué son malas en shellscripts en general y init-scripts en particular. Por lo tanto, debe elegir conscientemente si necesita /bin/sho /bin/bashcomo intérprete para su guión.

No se supone que Dash se use como shell predeterminado en sus sistemas. Solo usa Bash para eso. Para la portabilidad de sus scripts, puede usar Dash como intérprete para aumentar las probabilidades de que los scripts se ejecuten en otros sabores de Linux y Unixes.

wzzrd
fuente
1
Si escribe scripts con Bashisms, especifique /bin/bash; muchos sistemas shque no son Linux tienen shells reales que ni siquiera son compatibles bash.
Chris S
echo ${a#123}no es un bashism, es parte de la especificación de expansión del parámetro POSIX pubs.opengroup.org/onlinepubs/009695399/utilities/… Simplemente no obtienes los Bash de estilo sed más avanzados, Los posix son estilo de subcadena + caracteres de expansión simples. Es decir, POSIX también permiteecho ${a#*6}
JM Becker
0

Como no todos los shells se configuran $SHELLcuando se ejecutan, descubres tu shell actual con:

echo $0

Si da un error, es csh, de lo contrario es con el argv[0]que fue invocado, que generalmente es el shell, quizás con un -guión inicial, para indicar que es un shell de inicio de sesión.

Esto no está garantizado , ya que argv[0]está bajo el control del proceso de invocación, pero en la práctica es el enfoque más confiable.

Phil P
fuente