¿Bash y sh ejecutan un script de forma diferente? Ejecuté un script de shell con bash y sh, y obtuve el mismo resultado. Entonces, ¿cuál es la diferencia?
Además, cuando simplemente ejecuta ./executable
, ¿usa bash o sh?
Comentarios
Respuesta
Eso depende del sistema que esté ejecutando. Muchos sistemas operativos, especialmente los basados en Linux, sh
es un enlace a bash
.
En tal caso, Todavía hay algunas diferencias de comportamiento en las que bash
intenta parecerse más al tradicional bourne shell cuando se llama sh
, pero aún acepta la mayoría de los bashismos.
En algunos otros sistemas operativos, como los basados en Debian, sh
lo proporciona dash
, no bash
. Eso hace una diferencia mucho mayor ya que dash
no admite bashisms, ya que está diseñado para ser una implementación de shell POSIX limpia.
En sistemas operativos propietarios, sh
suele ser proporcionado por un ksh88
compatible con POSIX que, como dash
, no «implementa bashismos». En Solaris 10 y anteriores, dependiendo de cuál sea su PATH, sh
probablemente será un shell Bourne heredado, anterior a POSIX.
En cualquier caso, es probable que obtenga el mismo resultado con su prueba simplemente porque su secuencia de comandos no estaba usando ningún bash
comando, opción o sintaxis específicos.
Cuando ejecuta ./executable
, qué shell se ejecutará esencialmente depende del shebang escrito al principio del script .executable. Será bash
si el shebang lo especifica:
#!/bin/bash ....
Si no hay ningún shebang y llamas al script desde un shell compatible con POSIX, el script debe ser ejecutado técnicamente por el primer sh
encontrado en la RUTA. Muchos intérpretes de shell como bash
, dash
y ksh
se consideran POSIX, por lo que lo harán interpretar el guión. Tenga en cuenta que la SHELL
variable de entorno no se utiliza aquí.
Comentarios
- Miré a mi alrededor en
/bin
y descubrí quesh
es un enlace simbólico adash
en lugar debash
. Entonces, ¿cómo hicieron lo mismo? No era ' realmente ejecutar ningún comando de script bash, solo comandos de terminal para usar otros paquetes ' herramientas. - Si su script de shell solo llama secuencialmente a otros comandos, cualquier intérprete de shell lo ejecutará con el mismo resultado. Nada inesperado aquí.
- Esto no está ' t relacionado con la pregunta, pero ¿cuál es exactamente la diferencia entre
bash
ydash
? - Ambos utilizan la sintaxis del shell Bourne. Como escribí en mi respuesta,
dash
es una implementación limpia del estándar de shell POSIX. Por otro lado,bash
es un shell con una gran cantidad de extensiones y características no estándar, algunas inspiradas enksh
,ksh93
y otras shells, y algunas específicas de bash, conocidas como bashisms. Existe una herramienta llamada checkbashisms que ayuda a identificar todo lo que no es estrictamente portátil en un script de shell determinado.
Respuesta
Sí, podría serlo, pero no tiene por qué serlo. Las dos carcasas no son iguales, pero los conceptos básicos son compatibles. Consulte esta publicación para obtener más detalles.
Puede usar la siguiente línea en un script para verificar el intérprete que se usa:
ps h -p $$ -o args="" | cut -f1 -d" "
Puede especificar explícitamente el shell que se utilizará cuando el script se ejecute directamente con la línea sheebang
:
#!/bin/sh
o
#!/bin/bash
$SHELL
no se usa para decidir qué shell interpretará la./executable
texto. Tampoco ' indica necesariamente cuál es el shell actual.