sh vs bash : Un resumen
Si estás leyendo esto entonces hay una buena probabilidad de que te hayas encontrado con los términos shell, sh, bash etc en el pasado. Estos términos pueden sonar confusos y como están estrechamente relacionados que hace que el problema sea aún peor. Así que he decidido escribir este post con el objetivo de tratar de explicar las diferencias entre ellos.
Shell vs Kernel
Antes de avanzar es importante que entendamos lo que significan los términos shell y kernel.
Kernel
El kernel es el centro del sistema operativo. Es responsable de hacer cosas como interactuar con el hardware, hacer E/S de archivos, y desatar procesos.
Shell
El shell actúa como una interfaz entre el usuario y el kernel. Técnicamente hablando, un shell es un intérprete de línea de comandos, es decir, el programa que interpreta el comando que se introduce en el emulador de terminal (modo interactivo) o procesa los scripts del shell (archivos de texto que contienen comandos).
Ahora que tenemos una idea de lo que son el shell y el kernel, podemos intentar entender sh y Bash.
sh
En sentido estricto, sh (o el Lenguaje de Comandos del Shell) es un lenguaje de programación descrito por el estándar POSIX. La clave aquí es que sh no es realmente un lenguaje de programación en sí mismo. Es sólo una especificación. La especificación es una descripción detallada de la sintaxis y la semántica de ese lenguaje. La especificación no incluye una implementación.
Bash
Hay diferentes sistemas operativos con sus propios shells y kernel. Bash es el shell del sistema operativo GNU. Pero también podemos decir que bash es un lenguaje de programación.
Espera, ¿no es confuso? ¿Es bash tanto un shell como un lenguaje de programación?
Piensa en python. También podemos iniciar Python en modo interactivo y se comporta como una shell. O JavaScript, o Ruby o cualquier lenguaje de scripting.
¿Tiene sentido?
Así que bash es un lenguaje de programación que puede pensarse como una implementación de sh (aunque eso ha cambiado con el tiempo).
Para resumir, sh es una especificación, bash es la implementación.