Introducción
En el mundo de Linux, la línea de comandos es una herramienta fundamental para administradores, desarrolladores y usuarios avanzados. Aunque muchos asocian la terminal con bash, existe una alternativa más mínima y estandarizada conocida como sh. Este comando invoca el shell POSIX estándar, cuyo comportamiento está definido por la especificación POSIX.1‑2008 y garantiza portabilidad entre diferentes sistemas Unix‑like. En este artículo exploraremos qué es sh, sus características principales, cómo usarlo eficazmente y en qué situaciones resulta preferible sobre otras shells.
¿Qué es sh?
El comando sh no es una shell específica, sino una interfaz que apunta a la implementación de shell POSIX del sistema. En la mayoría de distribuciones Linux, sh es un enlace simbólico a dash (Debian Almquist Shell) o a bash cuando se ejecuta en modo POSIX. Independientemente de la implementación subyacente, al invocar sh se asegura que el intérprete siga estrictamente el estándar POSIX, evitando extensiones propias de bash u otras shells.
Características principales
- Compatibilidad POSIX: solo permite sintaxis y utilidades definidas en el estándar.
- Consumo reducido de recursos: ideal para scripts de arranque y entornos embebidos.
- Previsibilidad: el comportamiento es el mismo en cualquier sistema que cumpla POSIX.
- Ausencia de características avanzadas: no incluye arreglos asociativos, expansión de parámetros compleja o depuración interactiva.
Uso básico
Para ejecutar una orden sencilla con sh basta con escribirla en la terminal:
sh -c "echo Hola mundo"
La opción -c le indica a sh que lea la orden desde la cadena siguiente. Otra forma común es crear un archivo de script y darle el permiso de ejecución:
#!/bin/sh
printf 'Versión del kernel: %s\\n' "$(uname -r)"
Guardar el contenido como versión.sh, ejecutar chmod +x versión.sh y luego ./versión.sh.
Ejemplos prácticos
- Comprobar si un directorio existe y crearlo si no:
#!/bin/sh
[ -d "$HOME/backup" ] || mkdir -p "$HOME/backup"
#!/bin/sh
for f in *; do
[ -f "$f" ] && printf '%s: %s\\n' \"$f\" \"$(stat -c%s \"$f\")\"
done
#!/bin/sh
cat /etc/passwd | grep '^/home' | cut -d: -f1
Diferencias con bash
- Bash incluye características como arreglos,
[[ ]]para pruebas avanzadas y$()con anidamiento ilimitado. - En modo POSIX (
bash --posix) bash se acerca ash, pero aún permite ciertas extensiones si no se activa estrictamente. - Los scripts que usan
shson más portables; aquellos que dependen de bash pueden fallar en sistemas minimalistas como Alpine Linux o entornos de contenedores muy reducidos.
Cuándo usar sh
Se recomienda utilizar sh en los siguientes escenarios:
- Scripts de inicialización del sistema (
/etc/init.d,systemdservice files que llaman aExecStart). - Entornos de contenedores donde se busca una imagen mínima (por ejemplo,
alpine). - Cuando se necesita garantizar que el script se ejecute igual en cualquier distribución Unix‑like.
- Para tareas simples de administración donde no se requieren funcionalidades avanzadas de bash.
Conclusión
El comando sh representa la esencia de la shell POSIX estándar: simplicidad, portabilidad y previsibilidad. Aunque carece de muchas de las comodidades que ofrece bash, su valor radica en proporcionar un entorno confiable para scripts que deben ejecutarse en diversos sistemas sin sorpresas. Conocer cuándo y cómo usar sh es una habilidad esencial para cualquier profesional que trabaje con Linux y desee escribir código robusto y portable.


