¿Cuál es la diferencia entre #! / bin / sh y #! / bin / bash?

211

si escribo,

#!/bin/bash
echo "foo"

o

#!/bin/sh
echo "foo"

ambos producen lo mismo. He visto algunos scripts que comienzan con #!/bin/sh o #!/bin/bash . ¿Hay alguna diferencia entre ellos?

    
pregunta Rahul Virpara 25.05.2012 - 05:59

3 respuestas

178

bash y sh son dos conchas diferentes. Básicamente bash es sh , con más funciones y una mejor sintaxis. La mayoría de los comandos funcionan de la misma manera, pero son diferentes.

Una vez dicho esto, debes darte cuenta de que /bin/sh en la mayoría de los sistemas será un enlace simbólico y no invocará sh . En Ubuntu /bin/sh utilizado para vincular a bash , comportamiento típico en distribuciones de Linux, pero ahora ha cambiado a la vinculación a otro shell llamado dash . Usaría bash , ya que es más o menos el estándar (o al menos el más común, según mi experiencia). De hecho, surgen problemas cuando un script bash usa #!/bin/sh porque el creador del script asume que el enlace es bash cuando no tiene que ser así.

Para obtener más información, enlace , enlace .

    
respondido por el reverendj1 25.05.2012 - 06:08
62

En Linux y otros sistemas similares a Unix, tiene la opción de varios shells.

El intérprete de comandos es responsable no solo de dibujar su pequeño aviso, sino de interpretar sus comandos, especialmente si implementa una lógica complicada, como tuberías, condicionales, etc.

bash es el shell más común utilizado como shell predeterminado para usuarios de sistemas Linux . Es un descendiente espiritual de otras conchas usadas en la historia de Unix. Su nombre, bash es una abreviatura de Bourne-Again Shell, un homenaje al shell Bourne que fue diseñado para reemplazar, aunque también incorpora características del C Shell y del Korn Shell.

Se ejecuta, en estos días, desde /bin/bash ; cualquier sistema con bash lo tendrá accesible aquí.

Sin embargo, no son solo los usuarios quienes usan conchas. Los scripts ( shell scripts ) necesitan shells para interpretarlos. Cuando ejecuta un script de shell, su sistema necesita iniciar un proceso de shell para ejecutar su script.

El problema es que diferentes shells tienen pequeñas inconsistencias entre ellos, y cuando se trata de ejecutar scripts, estos pueden ser un problema real. bash tiene bastantes funciones de scripting que son únicas solo para bash, y no para otras shells. Esto está bien, si siempre vas a usar bash para ejecutar esos scripts. Otros shells pueden intentar emular bash o adherirse al estándar POSIX, que bash admite bastante bien (aunque agrega sus propias extensiones).

Es posible especificar en la parte superior de un script de shell con qué shell debería ejecutarse utilizando un shebang. Un script puede especificar #!/bin/bash en la primera línea, lo que significa que el script siempre debe ejecutarse con bash, en lugar de otro shell.

/ bin / sh es un ejecutable que representa el shell del sistema . En realidad, generalmente se implementa como un enlace simbólico que apunta al ejecutable para cualquier shell que sea el shell del sistema. El shell del sistema es una especie de shell predeterminado que las secuencias de comandos del sistema deberían usar. En las distribuciones de Linux, durante mucho tiempo, este era generalmente un enlace simbólico a bash , tanto así que se ha convertido en una especie de convención para siempre vincular / bin / sh a bash o un shell compatible con bash . Sin embargo, en los últimos años Debian (y Ubuntu) decidieron cambiar el shell del sistema de bash a dash - un similar shell - rompiendo con una larga tradición en Linux (bueno, GNU) de usar bash para / bin / sh. Dash se ve como un shell más ligero y mucho más rápido que puede ser beneficioso para la velocidad de arranque (y otras cosas que requieren una gran cantidad de scripts de shell, como scripts de instalación de paquetes).

Dash es bastante compatible con bash, ya que se basa en el mismo estándar POSIX. Sin embargo, no implementa las extensiones específicas de bash. Existen scripts que usan #!/bin/sh (el shell del sistema) como su shebang, pero que requieren extensiones específicas de bash. Esto se considera actualmente como un error que debe ser corregido por Debian y Ubuntu, que requieren / bin / sh para poder trabajar cuando apunta a la línea.

A pesar de que el caparazón del sistema de Ubuntu apunta hacia el tablero, su shell de inicio de sesión como usuario continúa siendo bash en este momento. Es decir, cuando inicie sesión en un emulador de terminal en cualquier lugar de Linux, su shell de inicio de sesión será bash. La velocidad de operación no es tanto un problema cuando el shell se usa de forma interactiva, y los usuarios están familiarizados con bash (y pueden tener personalizaciones específicas de bash en su directorio de inicio).

Lo que debe usar al escribir scripts

Si su script requiere funciones solo compatibles con bash, use #!/bin/bash .

Pero, si es posible, sería bueno asegurarse de que su script sea compatible con POSIX, y use #!/bin/sh , que siempre, de manera confiable, apunte al shell del sistema compatible con POSIX preferido en cualquier instalación.

    
respondido por el thomasrutter 25.05.2012 - 10:31
15

Además de las respuestas anteriores, incluso si /bin/sh es un enlace simbólico a /bin/bash , #!/bin/sh no es totalmente equivalente a #!/bin/bash .

De la página de manual de bash (1) :

  

"Si bash se invoca con el nombre sh, intenta imitar el inicio   comportamiento de las versiones históricas de sh lo más cerca posible, mientras   conforme al estándar POSIX también. "

Por ejemplo, la sintaxis específica de bash:

 exec  > >(tee logfile.txt)

da un error en un shell que comienza con #!/bin/sh , incluso con el enlace simbólico sh- & gt; bash en su lugar.

    
respondido por el AnkiF 14.01.2015 - 12:24

Lea otras preguntas en las etiquetas