HOWTO · Linux

Diferencia entre Sh y Bash

Este tutorial explica qué es un shell, conociendo el shell que se está utilizando actualmente, verificando la lista de todos los shells disponibles y la diferencia entre sh y bash.

En esta página

Un shell es un intérprete de comandos. Para identificar el proceso de shell que se ejecuta en tu terminal, inspecciona ese proceso; para averiguar qué shell está configurado para tu cuenta, consulta el registro de la cuenta. El archivo del sistema /etc/shells enumera los shells aceptados como shells de inicio de sesión válidos. Usa sh para scripts portables de estilo POSIX y Bash cuando necesites sus funciones adicionales.

¿Qué es un shell?

Un shell lee comandos y coordina su ejecución por parte del sistema operativo. Un shell interactivo recibe comandos desde una terminal, mientras que un archivo de script puede contener comandos para que los ejecute un intérprete. Los sistemas Linux pueden ofrecer varios shells, como Bash, Dash u otra implementación compatible con POSIX. El shell que estás usando ahora, el configurado para tu cuenta y el intérprete de un script concreto son datos relacionados, pero distintos.

Cómo encontrar el shell actual

Para inspeccionar el proceso de shell actual en Linux, ejecuta ps -p "$$" -o comm=. El parámetro $$ se expande al ID del proceso del shell actual, y ps muestra el nombre de comando de ese proceso. Esto identifica el proceso en ejecución; no necesariamente indica qué shell inicia tu cuenta al iniciar sesión. Un proceso iniciado desde otro shell, terminal o script puede ser distinto del shell de inicio de sesión configurado.

El registro de la cuenta en /etc/passwd almacena un shell de inicio de sesión configurado, no un proceso activo. Para la cuenta actual, getent passwd "$USER" consulta la base de datos de cuentas del sistema e imprime su registro; el último campo, separado por dos puntos, contiene la ruta del shell configurado. Esta puede diferir del proceso de shell que se está ejecutando. Los servicios de cuentas del sistema y la configuración del entorno también pueden afectar cómo se inicia una sesión, así que inspecciona los procesos cuando quieras saber «qué se está ejecutando ahora».

Cómo encontrar los shells disponibles

Lee /etc/shells, por ejemplo con cat /etc/shells, para ver las rutas que tu sistema enumera como shells de inicio de sesión válidos. El contenido varía según el sistema. El archivo no es un inventario completo de todos los binarios de shell instalados en la máquina: puede que un programa instalado no aparezca en la lista, y que una ruta enumerada se gestione mediante un enlace simbólico. Usa el archivo para comprobar qué shells son aptos para iniciar sesión; no demuestra que todos los programas enumerados estén ejecutándose ni que incluya todos los shells instalados.

El comando sh y su uso

sh es el nombre tradicional de un intérprete de lenguaje de comandos. En los scripts de shell portables, sh suele referirse a escribir en el lenguaje de shell POSIX para que el script pueda ejecutarse en implementaciones compatibles. POSIX especifica comportamientos comunes, pero /bin/sh es una ruta cuya implementación depende del sistema operativo y la distribución. Puede apuntar a Dash, Bash u otro shell; no des por sentado cuál sin comprobarlo en tu sistema.

La primera línea de un script, llamada shebang, indica el intérprete que se usa al iniciar el script como ejecutable. Por ejemplo, #!/bin/sh solicita el intérprete ubicado en /bin/sh; no garantiza qué implementación selecciona esa ruta. También puedes pasar explícitamente el mismo script a sh desde la línea de comandos. Evita la sintaxis exclusiva de Bash en scripts destinados a sh y usa construcciones definidas por POSIX cuando necesites portabilidad.

Ejecuta este ejemplo:

El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.

printf 'Hello, shell!\n'
Hello, shell!

Este comando autónomo imprime la salida registrada en la evidencia de ejecución proporcionada.

Bash y su uso

Bash (Bourne Again SHell) es un shell de uso extendido que ofrece funciones adicionales a las de los scripts portables de sh, como matrices, pruebas [[ ... ]] y sustitución de procesos. Si un script usa estas extensiones, debe indicar Bash en su shebang, por ejemplo, #!/bin/bash, y ejecutarse con Bash. Bash es común en Linux, pero no es el shell predeterminado en todos los sistemas Linux.

Bash también puede activar el modo POSIX. Inicia Bash con bash --posix o activa ese modo dentro de un script de Bash con set -o posix. Esto adapta el comportamiento de Bash a los requisitos de POSIX; no lo convierte en otra implementación de sh ni hace que todos los scripts específicos de Bash sean portables. Si la portabilidad es importante, escribe en el lenguaje de shell POSIX y prueba el script con los shells de los sistemas de destino.