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 sh
es anterior bash
y 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?
sh
ybash
): http://en.wikipedia.org/wiki/Comparison_of_command_shellsRespuestas:
bash
es un superconjunto desh
ie. todo lo que puedes hacersh
puedes hacerlobash
.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/sh
como enlace a/bin/bash
Para una explicación completa de lo que aquí hay un tutorial
fuente
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_shellsh
muchos 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.sh
no se extendió simplemente: su código fuente es puro infierno. Echar un vistazo. Se supone que es C ...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
sh
comando 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
sh
comando casi siempre es solo un enlacebash
, con las mismas características.fuente
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 bash
tiene 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:
hombre bash :
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.Pero incluso si deshabilita el modo POSIX, echo se comporta de manera
echo -e
predeterminada:/ 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 +B
en 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.
fuente
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:
Entonces
sh
, trata de emular el comportamiento histórico de sh. Comobash
, trata de ser lo más útil posible como un shell de inicio de sesión interactivo.fuente
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).
fuente
ldconfig
o si su/lib
directorio se borra por alguna razón.