¿Cuál es la diferencia entre usar bash y sh para ejecutar un script?

¿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

  • @Pandya La variable $SHELL no se usa para decidir qué shell interpretará la ./executable texto. Tampoco ' indica necesariamente cuál es el shell actual.
  • @jlliagre ¡oh! está bien. wiki.debian.org dice " SHELL = El shell actual. "
  • @Pandya debería decir " El usuario ' s shell de inicio de sesión ". El shell actual puede ser diferente.

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í que sh es un enlace simbólico a dash en lugar de bash. 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 y dash?
  • 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 en ksh, 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 

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *