¿Que es un Shell?
Un shell es el interprete de comandos que traduce las ordenes que escribimos en la terminal y las envia al sistema operativo. No son utilidades que se ejecutan sobre archivos, sino que definen el entorno de ejecucion de los comandos y scripts.
En Linux existen varios shells, siendo los mas comunes:
- sh → Shell estandar (Bourne Shell) — compatibilidad POSIX maxima
- bash → Bourne Again Shell — el shell por defecto en la mayoria de distribuciones Linux
- Otros:
zsh,ksh,dash,fish, etc.
/bin/sh no es el Bourne Shell original, sino un enlace simbolico a dash (un shell ligero compatible con POSIX). El shell interactivo del usuario jose es /bin/bash. Puedes comprobarlo con echo $SHELL.Es el shell original y uno de los mas basicos y universales en sistemas Unix/Linux. Se utiliza para ejecutar scripts que deben ser compatibles con cualquier sistema, ya que solo usa comandos y sintaxis estandar POSIX.
Sintaxis
sh [opciones] script.sh
2.1 Ejecutar un script con sh
sh hola.sh
2.2 Ejecutar un comando directamente con -c
sh -c "echo Hola desde sh"
2.3 Script de ejemplo — hola.sh
# Crear el archivo nano hola.sh # Contenido del archivo: echo "Hola, soy $USER y estoy usando sh" # Ejecutar sh hola.sh
Hola, soy jose y estoy usando sh
Es el shell mas popular y el que utiliza la mayoria de los usuarios de Linux por defecto para la linea de comandos interactiva. Ofrece muchas caracteristicas avanzadas: historial de comandos, autocompletado avanzado, arrays, y mas opciones de sintaxis que lo hacen ideal para el uso diario y para scripts complejos.
Sintaxis
bash [opciones] script.sh
3.1 Ejecutar un script con bash
bash mi_script.sh
3.2 Ejecutar un comando con bash -c
bash -c "echo Hola desde bash"
3.3 Script de ejemplo — mi_script.sh
#!/bin/bash nombre="jose" echo "Hola $nombre, este script se ejecuta en Bash"
chmod +x mi_script.sh ./mi_script.sh
Hola jose, este script se ejecuta en Bash
Diferencias sh vs bash
| Caracteristica | sh (dash en Ubuntu) | bash |
|---|---|---|
| Compatibilidad | Estandar POSIX | Compatible con sh + extensiones propias |
| Funciones avanzadas | No todas disponibles | ✅ Arrays, alias, autocompletado, historial |
| Velocidad | ⚡ Mas rapido (simplificado) | Ligeramente mas lento por las funciones extra |
| Portabilidad | ✅ Alta (funciona en cualquier UNIX) | Media — algunos comandos son exclusivos de bash |
| Uso habitual | Scripts basicos del sistema | Scripts personales y de administracion |
| Binario en Ubuntu | /bin/sh → symlink a dash |
/bin/bash |
# Ver la shell configurada por defecto para jose echo $SHELL # Salida esperada: /bin/bash # Ver a que apunta /bin/sh ls -la /bin/sh # Salida: /bin/sh -> dash
La linea #! (pronunciado shebang) es una convencion crucial utilizada en la primera linea de un script ejecutable en Linux. Su proposito es especificar que interprete debe ser usado para ejecutar las instrucciones del script.
#!/ruta/al/interprete # Ejemplos: #!/bin/bash # Usa bash #!/bin/sh # Usa sh (dash en Ubuntu) #!/usr/bin/env bash # Forma portable — busca bash en $PATH #!/usr/bin/python3 # Script Python
Ejemplos de Shebang
5.1 Script en Bash — hola_bash.sh
#!/bin/bash echo "Hola desde Bash"
5.2 Script en sh — hola_sh.sh
#!/bin/sh echo "Hola desde sh"
5.3 Script en Python (referencia)
#!/usr/bin/python3 print("Hola desde Python")
| Shebang | Comando de ejecucion | Uso y significado |
|---|---|---|
| #!/bin/bash | ./script.sh | Recomendado para la mayoria de scripts en Linux. Usa el interprete completo de Bash con todas sus funcionalidades. |
| #!/bin/sh | ./script.sh | Para scripts de compatibilidad. Usa el interprete POSIX (dash en Ubuntu). Evita errores con sintaxis avanzada. |
| #!/usr/bin/env bash | ./script.sh | Forma mas portable. env busca bash en el $PATH, util en sistemas donde bash no esta en /bin. |
| #!/usr/bin/python3 | ./script.py | Script Python 3. env python3 es la forma mas portable. |
Como Funciona el Shebang
Cuando ejecutas un script como ./info_sistema.sh, el sistema operativo sigue este proceso:
+x#!/bin/bash/bin/bash ./info_sistema.shCreando info_sistema.sh paso a paso
# Paso 1: Crear el archivo
nano info_sistema.sh
#!/bin/bash # Este script usa caracteristicas avanzadas de bash echo "El script se esta ejecutando con: $BASH_VERSION" echo "Directorio actual: $(pwd)" echo "Espacio libre en disco:" df -h | grep /dev/sda
# Paso 3: Dar permisos de ejecucion chmod +x info_sistema.sh # Paso 4: Ejecutar el script ./info_sistema.sh
Errores Comunes con #!
#!/usr/bin/env bash para maxima portabilidad./Script Completo de Practica
Crea el archivo /home/jose/scripts/mi_info.sh:
#!/bin/bash # Script para mostrar informacion basica del sistema echo "======================================" echo " Informacion del sistema de jose" echo "======================================" echo "Usuario: $USER" echo "Directorio actual: $(pwd)" echo "Fecha: $(date)" echo "Version del sistema:" lsb_release -d
chmod +x mi_info.sh ./mi_info.sh
====================================== Informacion del sistema de jose ====================================== Usuario: jose Directorio actual: /home/jose/scripts Fecha: jue 09 oct 2025 10:32:12 CEST Version del sistema: Description: Ubuntu 24.04 LTS
Buenas Practicas en Scripting
env busca bash en el $PATH en lugar de usar una ruta fija, funcionando en mas sistemas.bash -n script.sh para detectar errores de sintaxis sin ejecutar el script.set -e al principio del script para que se detenga automaticamente si ocurre un error. Evita que el script continue con un estado invalido.~/scripts/ y añade este directorio al PATH para ejecutarlos desde cualquier lugar.# Añadir ~/scripts al PATH de forma permanente echo 'export PATH=$PATH:/home/jose/scripts' >> ~/.bashrc source ~/.bashrc # Verificar sintaxis sin ejecutar bash -n mi_script.sh # Activar modo estricto en scripts #!/bin/bash set -e # Salir si un comando falla set -u # Tratar variables no definidas como error set -o pipefail # Propagar errores en pipelines
Resumen Rapido
| Elemento | Funcion | Ejemplo |
|---|---|---|
| sh | Ejecuta scripts en shell basico POSIX (dash en Ubuntu) | sh script.sh |
| bash | Shell avanzado con funciones extra y uso interactivo | bash script.sh |
| #! | Indica que interprete debe ejecutar el script | #!/bin/bash |
| chmod +x | Da permisos de ejecucion al script | chmod +x script.sh |
| ./script.sh | Ejecuta el script directamente usando su shebang | ./mi_script.sh |
| bash -n | Verifica la sintaxis sin ejecutar | bash -n script.sh |
| dos2unix | Convierte saltos CRLF (Windows) a LF (Linux) | dos2unix script.sh |
- Crear el script
nano /home/jose/scripts/saludo.sh
- Contenido del script
#!/bin/bash echo "Hola $USER, hoy es $(date +%A)"
- Dar permisos de ejecucion
chmod +x saludo.sh
- Ejecutar con bash
./saludo.sh
- Probar tambien con sh
sh saludo.sh
sh y con bash para este script simple. Las diferencias se notan cuando usas funcionalidades exclusivas de bash como arrays, process substitution o sintaxis de [[ ]].