🇯🇵 日本語 | 🇺🇸 English | 🇪🇸 Español | 🇵🇹 Português | 🇹🇭 ไทย | 🇨🇳 中文

¿Qué es Dash, el shell estándar de Ubuntu? Guía completa de uso y diferencias con Bash

Si usas Ubuntu, es posible que hayas oído hablar de Dash (dash). La existencia de Dash es especialmente importante al escribir scripts de shell. Aunque el shell que la mayoría de los usuarios utiliza a diario es Bash, en realidad, Dash trabaja activamente tras bambalinas en el sistema Ubuntu. En este artículo, explicaremos de manera sencilla para principiantes el papel de Dash como el shell estándar de Ubuntu, su uso básico y las diferencias con Bash que suelen confundir a muchos.

Como creador web, cada vez tendrás más oportunidades de trabajar con scripts de shell para la configuración de servidores y tareas de despliegue. Todo el código de este artículo está diseñado para funcionar con solo copiar y pegar, ¡así que anímate a probarlo y a experimentar la alegría de que "funcione"!


Para empezar, ¿qué es Dash y por qué se usa en Ubuntu?

Dash (Debian Almquist shell) es un shell de línea de comandos utilizado en sistemas operativos de tipo UNIX. Su principal característica es que es ligero y de funcionamiento rápido. En comparación con Bash, un shell con muchas funcionalidades, Dash se centra en las funciones básicas, lo que hace que la velocidad de ejecución de sus scripts sea mucho más rápida.

Ubuntu (y su base, Debian) aprovecha esta velocidad adoptando Dash como el shell de sistema predeterminado (/bin/sh) para ejecutar scripts de arranque del sistema y diversos procesos en segundo plano. Esto significa que, aparte del shell de inicio de sesión interactivo (/bin/bash) que usamos habitualmente en la terminal, Dash se encarga de realizar tareas de manera eficiente dentro del sistema. Esta división de tareas, "Dash para el shell del sistema, Bash para el shell de inicio de sesión", es lo que sustenta el rendimiento ágil de Ubuntu.

Verifiquemos a qué está enlazado /bin/sh en tu propio entorno. Al ejecutar el siguiente comando, se mostrará su verdadera identidad.

ls -l /bin/sh

En la mayoría de los casos, verás /bin/sh -> dash, lo que indica que la entidad real de /bin/sh es Dash.


Uso básico de Dash

Ahora, vamos a ejecutar un script sencillo usando Dash. El uso de Dash es muy simple.

1. Crear un archivo de script

Primero, crea un archivo de script simple con un editor de texto. Aquí lo llamaremos hello_dash.sh.

nano hello_dash.sh

Una vez que se abra el editor, pega el siguiente contenido y guárdalo.

#!/bin/sh
# La línea de arriba se llama "shebang" e indica que este script debe ejecutarse con /bin/sh (es decir, Dash).

echo "Hello, Dash!"

2. Otorgar permisos de ejecución

Dale al archivo de script que creaste los permisos necesarios para poder ejecutarlo.

chmod +x hello_dash.sh

3. Ejecutar el script

Ahora que está todo listo, ejecutemos el script.

./hello_dash.sh

Si en la terminal aparece "Hello, Dash!", ¡lo has logrado! Esta es la forma más básica de ejecutar un script de Dash. Al especificar #!/bin/sh en el shebang, el script fue interpretado y ejecutado por Dash.


Ejemplo avanzado: Usar variables y bucles en Dash

Como un ejemplo un poco más práctico, veamos un script que usa variables y un bucle while. La sintaxis básica es similar a la de Bash, pero es importante ser consciente de usar una escritura compatible con POSIX que funcione de manera fiable en Dash.

El siguiente script crea un bucle hasta que un contador llega a 3, mostrando el número actual del contador.

#!/bin/sh

# Definir una variable
COUNT=1

# Continuar el bucle mientras COUNT sea menor o igual que 3
while [ "$COUNT" -le 3 ]; do
  echo "Contador actual: $COUNT"
  # Sumar 1 a COUNT. Usar el comando expr es la forma más segura.
  COUNT=$(expr "$COUNT" + 1)
done

echo "Bucle finalizado."

Guarda este script con un nombre como loop_test.sh, otórgale permisos de ejecución de la misma manera y ejecútalo con ./loop_test.sh. Deberías ver cómo se cuenta del 1 al 3.


Puntos a tener en cuenta: Incompatibilidad entre Dash y Bash

El problema más común con el que se encuentran los principiantes al escribir scripts de shell es la diferencia de funcionalidades entre Dash y Bash. Es frecuente que un comando que funciona sin problemas en la terminal habitual (Bash) dé un error en un script que especifica /bin/sh (Dash).

En el entorno del desarrollo web, cuando se ejecutan scripts como trabajos de cron en un servidor o a través de herramientas de despliegue, a menudo se ejecutan con el shell predeterminado del sistema, que es Dash. Por lo tanto, si usas inconscientemente funcionalidades exclusivas de Bash (conocidas como "Bashisms"), puedes provocar errores que solo aparecen en el entorno de producción.

A continuación, se presentan algunos de los ejemplos más representativos de incompatibilidad a los que debes prestar especial atención.

1. No se pueden usar arrays

En Bash, puedes manejar arrays fácilmente con algo como fruits=("Apple" "Banana" "Cherry"), pero Dash no admite arrays.

Ejemplo que solo funciona en Bash (error en Dash):

#!/bin/bash
# Presta atención a que el shebang es /bin/bash

fruits=("Apple" "Banana" "Cherry")
echo "La primera fruta es ${fruits[0]}."

2. No se puede usar la expansión de llaves (Brace Expansion) {..}

En Bash, si escribes echo file{1..3}.txt, se expande a file1.txt file2.txt file3.txt, pero Dash no tiene esta funcionalidad.

Ejemplo que solo funciona en Bash (se muestra tal cual en Dash):

#!/bin/bash

# Este comando genera tres nombres de archivo en Bash
touch data_{a,b,c}.csv

Para hacer lo mismo en Dash, necesitarías usar un bucle for o algo similar.


3. No se puede usar el comando de prueba `[[ ... ]]`

Como se mencionó anteriormente, el comando de prueba extendido de Bash, [[ ... ]], aunque es más potente, no se puede usar en Dash. Debes ceñirte al compatible con POSIX, [ ... ].

Ejemplo que solo funciona en Bash (error en Dash):

#!/bin/bash

NAME="hoge"
# [[ ... ]] puede usar && y || internamente
if [[ "$NAME" == "hoge" && -n "$NAME" ]]; then
  echo "El nombre es hoge."
fi

Código alternativo que también funciona en Dash:

#!/bin/sh

NAME="hoge"
# En [ ... ] se usa -a (AND)
if [ "$NAME" = "hoge" -a -n "$NAME" ]; then
  echo "El nombre es hoge."
fi

Ten en cuenta también que la comparación de cadenas usa = en lugar de ==.


Conclusión: Escribe scripts robustos teniendo en cuenta a Dash

En este artículo, hemos explicado el papel de Dash como el shell estándar de Ubuntu, su uso básico y sus diferencias con Bash.

Al principio puede ser confuso, pero entender estas diferencias puede evitar problemas del tipo "funcionaba en mi máquina local pero no en el servidor". ¡Familiarízate con el mundo de Ubuntu dash y aspira a crear scripts de shell más fiables!


Artículos relacionados

Si quieres aprender más sobre la escritura de scripts avanzados y la compatibilidad con Bash, también te recomendamos este artículo.