¿Cuál es la diferencia entre bash y sh?

28

Veo dos tipos de código en uso:

#!/usr/bin/sh

y:

#!/user/bin/bash

Busqué esto en línea y las opiniones varían mucho. Las explicaciones que vi en la mayoría de los sitios web dicen que shes anterior bashy que no hay una diferencia real.

¿Alguien sabe la diferencia entre estos? ¿Me puede dar un ejemplo práctico de cuándo usar uno sobre el otro?

Saif Bechan
fuente
Para una visión general sobre los diferentes shells (no solo shy bash): http://en.wikipedia.org/wiki/Comparison_of_command_shells
akira
1
Otra gran historia aquí: faqs.org/faqs/unix-faq/shell/shell-differences
John Wright

Respuestas:

34

bashes un superconjunto de shie. todo lo que puedes hacer shpuedes hacerlo bash.

Bash tiene más funciones (ramificación, construcción, arrays) que hacen que la escritura sea más fácil de escribir. Algunos * nix'es posteriores tienen /bin/shcomo enlace a/bin/bash

Para una explicación completa de lo que aquí hay un tutorial

Nifle
fuente
55
@Saif Bechan: Una razón por la que el shell Bourne ( sh) no solo se extendió es porque Bash` fue escrito por otra persona. También apuesto a que hubo problemas de licencia. Lea el artículo sobre Bourne Shell en.wikipedia.org/wiki/Bourne_shell
Felix
77
Eliminar eliminaría shmuchos scripts que esperan que esté allí y dependan de la forma en que analiza las cosas. Puede que a los usuarios de Linux no les importe, pero las personas que gastan $$ miles en Solaris, AIX o HP-UX pueden estar muy molestas.
njd
3
... y aún más divertido, Ubuntu symlinks / bin / sh to dash. Dash no es completamente compatible con sh o bash, pero se supone que se inicia más rápido. Cuando el sistema se inicia, se ejecutan todos los scripts init.d y creo que el tiempo ahorrado en general vale la pena.
kbyrd
8
Estoy bastante seguro de que Dash es completamente compatible con sh. El problema es que algunas personas escriben scripts que dicen / bin / sh, pero el script en sí mismo requiere / bin / bash para funcionar. Nadie nota un problema, porque la mayoría de las veces, / bin / sh simplemente apunta a / bin / bash.
davr
8
@Saif: hay otra razón por la que shno se extendió simplemente: su código fuente es puro infierno. Echar un vistazo. Se supone que es C ...
Grawity
6

Tradicionalmente, / bin / sh habría sido el shell Bourne original, que no tiene edición de historial o de línea de comandos, ni control de trabajo.

Durante los últimos 15 años más o menos, la mayoría de los Unix han instalado el shell POSIX, o al menos ksh o bash (que son casi como POSIX), pero aún tienen el shell más limitado en / bin / sh

La razón de esto es para que los scripts de shell más antiguos que esperan el shcomando anterior sigan funcionando.
Desde personajes como {, }y !tienen un significado especial a la fiesta, es posible que un script de shell mayor uso de los caracteres (sin escapar de ellos) podría fallar.
(El shell Bourne tomaría !!{1,2}literalmente, mientras que bash lo interpretaría como una repetición del comando anterior ( !!) seguido de una llave de expansión).

Sin embargo, en Linux, el shcomando casi siempre es solo un enlace bash, con las mismas características.

njd
fuente
2
Se supone que Bash se comporta (pero no siempre) en modo de compatibilidad sh si se invoca como / bin / sh. Se rompieron muchas cosas cuando Ubuntu cambió / bin / sh de vincular a / bin / bash a vincular a / bin / dash. Las cosas que se rompieron asumieron bashismos cuando deberían haber estado usando sh estándar.
Broam
4

sh puede significar Bourne shell o / bin / sh, que es algún otro shell (compatible con POSIX) en la mayoría de las plataformas modernas. "El shell POSIX" es el shell abstracto definido por POSIX , que se implementa mediante bash en modo POSIX, o ksh o dash por defecto. / bin / sh a veces también se denomina shell POSIX, porque es un shell que se ajusta a POSIX en la mayoría de las plataformas. Los proyectiles Bourne originales no son proyectiles POSIX.

bashref tiene una lista de diferencias entre bash y los shells Bourne . man bashtiene una lista de cambios cuando se invoca bash en modo POSIX .

/ bin / sh no es un enlace simbólico o un enlace duro en OS X, pero es casi del mismo tamaño que / bin / bash:

$ ls -li /bin/{ba,}sh
29631757 -r-xr-xr-x  1 root  wheel  1333920 Jul 26 01:52 /bin/bash
29631758 -r-xr-xr-x  1 root  wheel  1334000 Jul 26 01:52 /bin/sh

hombre bash :

Si se invoca bash con el nombre sh, intenta imitar el comportamiento de inicio de las versiones históricas de sh lo más cerca posible, a la vez que se ajusta al estándar POSIX.

La imitación de las conchas de Bourne es bastante limitada. bash +B(Bourne) en realidad deshabilitaría características como la expansión de llaves.

$ sh
$ echo {a,b}
a b
$ echo $BASH_VERSION
3.2.48(1)-release
$ bash +B
$ echo {a,b}
{a,b}

Pero incluso si deshabilita el modo POSIX, echo se comporta de manera echo -epredeterminada:

$ sh
$ shopt -uo posix
$ echo '1\b2'
2

/ bin / sh es dash en Ubuntu , por lo que algunos bashismos funcionan con / bin / sh en OS X pero no Ubuntu.

Si realmente desea escribir scripts para (algo así como) los shells Bourne originales, puede usar #!/usr/bin/env bash +Ben su lugar.

Creo que es más fácil escribir scripts para bash que evitar funciones que no son parte de las especificaciones POSIX o shells Bourne o probar todo con otros shells.

Lri
fuente
2

En realidad, aunque / bin / sh puede ser un enlace a / bin / bash, si se inicia como sh se comporta de manera diferente. De la página de manual de bash:

Si se invoca bash con el nombre sh, intenta imitar el comportamiento de inicio de las versiones históricas de sh lo más cerca posible, a la vez que se ajusta al estándar POSIX.

Entonces sh, trata de emular el comportamiento histórico de sh. Como bash, trata de ser lo más útil posible como un shell de inicio de sesión interactivo.

KeithB
fuente
2

En muchos sistemas y en Solaris en particular, bash está vinculado dinámicamente mientras sh está vinculado estáticamente. Esto puede representar una amenaza para la seguridad, por esta razón, el usuario root solo debe usar / bin / sh como shell (si alguna vez necesita iniciar sesión como root).

Alessandro Vozza
fuente
2
También puede ser útil en caso de emergencia si hizo algo malo ldconfigo si su /libdirectorio se borra por alguna razón.
LawrenceC