Ghost AcademySecLearn// Seguridad Informática
🐠 Scripting Linux · Ubuntu 24.04 · usuario jose
sh, bash y el #!

Guia practica sobre los interpretes de comandos sh y bash, sus diferencias, y el uso del shebang (#!) para definir el entorno de ejecucion de scripts en Linux. Con ejemplos reales, errores comunes y buenas practicas.

/bin/sh → dash /bin/bash #!/usr/bin/env bash chmod +x
shellscripting shebangPOSIX bashdash chmodportabilidad

¿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.
📝 Ubuntu 24.04: El binario /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.
29
sh — Bourne Shell
/bin/sh → enlace simbolico a dash en Ubuntu 24.04

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

sintaxis
sh [opciones] script.sh

2.1 Ejecutar un script con sh

bash — jose@ubuntu
sh hola.sh

2.2 Ejecutar un comando directamente con -c

bash — jose@ubuntu
sh -c "echo Hola desde sh"

2.3 Script de ejemplo — hola.sh

bash — crear y ejecutar hola.sh
# Crear el archivo
nano hola.sh

# Contenido del archivo:
echo "Hola, soy $USER y estoy usando sh"

# Ejecutar
sh hola.sh
▶ salida
Hola, soy jose y estoy usando sh
💡 Uso ideal de sh: Scripts muy portables que deben funcionar en cualquier UNIX/Linux sin depender de funcionalidades avanzadas de bash.
 
bash — Bourne-Again Shell
/bin/bash — shell interactivo por defecto en Ubuntu

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

sintaxis
bash [opciones] script.sh

3.1 Ejecutar un script con bash

bash — jose@ubuntu
bash mi_script.sh

3.2 Ejecutar un comando con bash -c

bash — jose@ubuntu
bash -c "echo Hola desde bash"

3.3 Script de ejemplo — mi_script.sh

bash — mi_script.sh
#!/bin/bash

nombre="jose"
echo "Hola $nombre, este script se ejecuta en Bash"
bash — dar permisos y ejecutar
chmod +x mi_script.sh
./mi_script.sh
▶ salida
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
bash — ver shell actual
# 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
30
El Shebang — #!
Primera linea del script que define el interprete a usar

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.

sintaxis del shebang
#!/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

/home/jose/scripts/hola_bash.sh
#!/bin/bash

echo "Hola desde Bash"

5.2 Script en sh — hola_sh.sh

/home/jose/scripts/hola_sh.sh
#!/bin/sh

echo "Hola desde sh"

5.3 Script en Python (referencia)

/home/jose/scripts/hola.py
#!/usr/bin/python3

print("Hola desde Python")
ShebangComando de ejecucionUso 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:

1Sistema ve permiso de ejecucion +x
→
2Lee primera linea: #!/bin/bash
→
3Ejecuta internamente: /bin/bash ./info_sistema.sh
💡 Sin shebang: Si el script no tiene shebang, se ejecuta con el shell actual del usuario (normalmente bash si el usuario esta en bash). Esto puede dar resultados inesperados si el script lo ejecuta otro proceso con un shell diferente.

Creando info_sistema.sh paso a paso

bash — crear info_sistema.sh
# Paso 1: Crear el archivo
nano info_sistema.sh
info_sistema.sh — contenido
#!/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
bash — dar permisos y ejecutar
# Paso 3: Dar permisos de ejecucion
chmod +x info_sistema.sh

# Paso 4: Ejecutar el script
./info_sistema.sh

Errores Comunes con #!

❌ MAL#!/usr/bin/bash
Ruta incorrecta en algunas distribuciones donde bash no esta en /usr/bin
✅ BIEN#!/bin/bash
Ruta estandar. O mejor aun: #!/usr/bin/env bash para maxima portabilidad
❌ MAL./script.sh # sin chmod +x
Permission denied — el script no tiene permiso de ejecucion
✅ BIENchmod +x script.sh
Dar permiso de ejecucion antes de ejecutar con ./
❌ MALEditar el script en Windows (saltos CRLF)
Los scripts editados en Windows usan CRLF (\r\n) que causan errores al ejecutar en Linux
✅ BIENdos2unix script.sh
Convertir saltos de linea de Windows (CRLF) a Unix (LF)

Script Completo de Practica

Crea el archivo /home/jose/scripts/mi_info.sh:

/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
bash — permisos y ejecucion
chmod +x mi_info.sh
./mi_info.sh
▶ salida esperada
======================================
 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

✅
Usa #!/usr/bin/env bash para portabilidad. env busca bash en el $PATH en lugar de usar una ruta fija, funcionando en mas sistemas.
✅
Usa comentarios (#) para documentar. Explica que hace cada seccion importante del script.
✅
Prueba con bash -n script.sh para detectar errores de sintaxis sin ejecutar el script.
✅
Usa set -e al principio del script para que se detenga automaticamente si ocurre un error. Evita que el script continue con un estado invalido.
✅
Guarda tus scripts en ~/scripts/ y añade este directorio al PATH para ejecutarlos desde cualquier lugar.
bash — añadir ~/scripts al PATH
# 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

ElementoFuncionEjemplo
shEjecuta scripts en shell basico POSIX (dash en Ubuntu)sh script.sh
bashShell avanzado con funciones extra y uso interactivobash script.sh
#!Indica que interprete debe ejecutar el script#!/bin/bash
chmod +xDa permisos de ejecucion al scriptchmod +x script.sh
./script.shEjecuta el script directamente usando su shebang./mi_script.sh
bash -nVerifica la sintaxis sin ejecutarbash -n script.sh
dos2unixConvierte saltos CRLF (Windows) a LF (Linux)dos2unix script.sh
📚 En resumen: bash es el shell interactivo y de programacion mas rico en caracteristicas. sh es el estandar de compatibilidad POSIX, ideal para scripts simples y portables. El #! (shebang) es la directiva que le dice al sistema que shell o interprete (bash, sh, python, etc.) debe usar para ejecutar el script.
EJERCICIO PRACTICO Script de saludo con fecha
  • 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
🔎 Observacion: Veras que funciona igual con 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 [[ ]].