359 votos

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

si escribo,

#!/bin/bash
echo "foo"

o

#!/bin/sh
echo "foo"

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

314voto

reverendj1 Puntos 7579

bash y sh son dos cascarones diferentes. Básicamente bash es sh con más funciones y mejor sintaxis. La mayoría de los comandos funcionan igual, pero son diferentes.

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 enlazar con bash , comportamiento típico en las distribuciones de Linux, pero ahora ha cambiado a enlazar con otro Shell llamado dash . Yo usaría bash ya que ese es el estándar (o al menos el más común, según mi experiencia). De hecho, los problemas surgen cuando un bash script utiliza #!/bin/sh porque el creador de scriptsupone que el enlace es a bash cuando no tiene por qué serlo.

Para más información, http://man.cx/sh , http://man.cx/bash .

35 votos

Su primer párrafo es bastante engañoso. "sh" no es un Shell en absoluto, sino un enlace simbólico al system Shell que en los sistemas Linux suele ser bash o dash (las versiones recientes de Ubuntu utilizan este último).

25 votos

/bin/sh solía ser un Shell llamado bourne Shell en 1977. bash es un Shell compatible con /bin/sh que puede ser utilizado como un reemplazo de bourne Shell que es conforme a posix. es.wikipedia.org/wiki/Bourne_shell

7 votos

bash es una norma de facto (muy utilizada) pero no es "estándar"; sh en Ubuntu utiliza tablero que es un Shell compatible con Posix, por lo que es realmente estándar. Mi consejo es utilizar tablero con la mayor frecuencia posible para los scripts, especialmente para los scripts. Aunque bash es más expresivo, tablero funciona mucho más rápido y es más seguro.

104voto

thomasrutter Puntos 12856

En Linux y otros sistemas tipo Unix puedes elegir entre varios shells.

El Shell es responsable no sólo de dibujar tu pequeño prompt, sino de interpretar tus comandos, especialmente si pones lógica complicada como tuberías, condicionales y demás.

bash es el Shell más común utilizado como Shell por defecto para los usuarios de sistemas Linux. Es un descendiente espiritual de otros shells utilizados a lo largo de la historia de Unix. Su nombre, bash es una abreviatura de Bourne-Again Shell, un homenaje al Bourne Shell que fue diseñado para reemplazar, aunque también incorpora características del C Shell y del Korn Shell.

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

Sin embargo, no sólo los usuarios utilizan las conchas. scripts ( Shell Shell ) necesitan conchas para interpretarlas. Cuando ejecuta un Shell ShellscriptShell, su sistema necesita iniciar un proceso Shell para ejecutar su ShellscriptShell.

El problema es que los diferentes shells tienen pequeñas inconsistencias entre ellos, y cuando se trata de ejecutar scripts, estos pueden ser un verdadero problema. bash tiene bastantes características de scripting que son exclusivas de bash, y no de otros shells. Esto está bien, si siempre vas a usar bash para ejecutar esos scripts. Otros shells pueden intentar emular a bash, o adherirse al estándar POSIX, que bash soporta bastante bien (aunque añade sus propias extensiones).

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

/bin/sh es un ejecutable que representa el system Shell . En realidad, suele implementarse como un enlace simbólico que apunta al ejecutable de cualquier Shell que sea el Shell del sistema. El Shell del sistema es una especie de Shell por defecto que los Shell del sistema deben utilizar. En las distribuciones de Linux, durante mucho tiempo esto era normalmente un enlace simbólico a bash Tanto es así que se ha convertido en una convención el enlazar siempre /bin/sh con bash o con un Shell compatible con bash. Sin embargo, en el último par de años Debian (y Ubuntu) decidió cambiar el sistema Shell de bash a tablero - un Shell similar - rompiendo con una larga tradición en Linux (bueno, GNU) de usar bash para /bin/sh. Dash es visto como un Shell más ligero, y mucho más rápido, lo que puede ser beneficioso para la velocidad de Shell (y otras cosas que requieren una gran cantidad de Shell Shell, como la instalación de paquetes Shell).

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 utilizan #!/bin/sh (el sistema Shell) como su shebang, pero que requieren extensiones específicas de bash. Esto se considera actualmente un error que debería solucionarse por Debian y Ubuntu, que requieren que /bin/sh pueda funcionar cuando se apunta a dash.

Aunque el sistema Ubuntu system Shell está apuntando a dash, su login Shell como usuario sigue siendo bash en este momento. Es decir, cuando te conectes a un emulador de terminal en cualquier lugar de Linux, tu login Shell será bash. La velocidad de operación no es tanto un problema cuando el Shell se utiliza 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 debes usar al escribir scripts

Si su script requiere características sólo soportadas por bash, utilice #!/bin/bash .

Pero si es posible, sería bueno asegurarse de que su script es compatible con POSIX, y utilizar #!/bin/sh que debería apuntar siempre, de forma bastante fiable, al sistema preferido compatible con POSIX Shell en cualquier instalación.

26voto

AnkiF Puntos 51

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

Desde el página man de bash(1) :

"Si bash es invocado con el nombre sh, intenta imitar el inicio comportamiento de las versiones históricas de sh tan cerca como sea posible, mientras que se ajusta al estándar POSIX".

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->bash.

12voto

GNU Bash: #!/bin/bash ; POSIX Shell: #!/bin/sh .

1 votos

Bueno, respuesta corta pero precisa. 还行

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: