El comando sh en Linux: shell POSIX estándar

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"
    
  • Recorrer los archivos de un directorio y mostrar su tamaño:
  • #!/bin/sh
    for f in *; do
      [ -f "$f" ] && printf '%s: %s\\n' \"$f\" \"$(stat -c%s \"$f\")\"
    done
    
  • Ejecutar una cadena de comandos con tuberías:
  • #!/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 a sh, pero aún permite ciertas extensiones si no se activa estrictamente.
  • Los scripts que usan sh son 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, systemd service files que llaman a ExecStart).
  • 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.

Esta obra está bajo una Licencia Creative Commons Atribución 4.0 Internacional para Francesc Roig francesc@vivaldi.net .

EspañolesEspañolEspañol