📱 Tutorial
El comando ":" de Linux no hace NADA — y los devs más expertos lo usan a diario
¿Sabías que existe un comando en Linux cuya única función es no hacer absolutamente nada? Se llama : (dos puntos), es un builtin del shell, y los developers más veteranos lo usan todos los días sin pensarlo dos veces.
Parece una broma, pero no lo es. El comando : — también conocido como null command o colon command — existe desde los albores de Unix y tiene una docena de usos prácticos que transformarán la forma en que escribes scripts de bash.
Y lo mejor: está disponible en cualquier shell POSIX. Bash, Zsh, Dash, Ash… todos lo tienen. No necesitas instalar nada.
¿Qué hace exactamente :?
Según la página de manual: "Do nothing, successfully." (No hacer nada, exitosamente).
El comando : evalúa sus argumentos pero los descarta, y siempre devuelve código de salida 0 (éxito). Es como un true que además puede evaluar expresiones sin ejecutarlas.
Suena inútil, ¿verdad? Aquí es donde se pone interesante.
1. Validar argumentos en una línea 🔥
Este es el uso que más vuelve loca a la gente cuando lo descubre. En lugar de escribir:
if [ -z "$1" ]; then
echo "Error: falta argumento"
exit 1
fi
Puedes reemplazar TODO eso con una sola línea usando la expansión de parámetros con ::
: "${1:?Error: falta argumento}"
¿Qué está pasando aquí? El ${var:?mensaje} imprime el mensaje y termina el script si la variable no está definida o está vacía. Y el : al inicio evita que el shell intente ejecutar el resultado como un comando.
El shell se encarga de todo: imprime el error, muestra el nombre del script y la línea, y sale con código 1. Sin if, sin echo, sin exit.
2. Truncar archivos al instante ⚡
¿Necesitas vaciar un archivo de logs sin borrarlo?
: > access.log
: > error.log
Es más rápido que cat /dev/null > archivo y más elegante que truncate. El : no produce salida, así que la redirección simplemente vacía el archivo. Puedes truncar varios a la vez:
: > error.log > access.log
3. Placeholder para bucles infinitos 🔄
Cuando empiezas un script y todavía no has escrito la lógica principal, : es el placeholder perfecto:
while true; do
: # TODO: implementar lógica
done
Mejor que sleep 1 porque no introduce delays artificiales, y mejor que dejarlo vacío porque un cuerpo de bucle vacío es un error de sintaxis en bash.
4. Definir valores por defecto con estilo 🎯
El patrón típico para defaults:
DATA_DIR="${DATA_DIR:-/var/lib/app}"
LOG_DIR="${LOG_DIR:-/var/log/app}"
Funciona, pero el shell no evalúa las expansiones hasta que se usan. Con : las fuerzas a evaluarse en el momento exacto que quieres:
: "${DATA_DIR:=/var/lib/app}"
: "${LOG_DIR:=/var/log/app}"
La diferencia es sutil pero importante: := asigna el valor por defecto a la variable (no solo lo usa), y el : hace que la asignación ocurra inmediatamente.
5. Comentarios y depuración de scripts 🔍
¿Tienes una línea que quieres desactivar temporalmente pero no quieres borrarla? En lugar de comentarla con #, ponle : al inicio:
: sudo rm -rf / --no-preserve-root
La diferencia con # es que : sigue parseando la línea como un comando — lo que significa que las expansiones de variables y globs se evalúan (pero no se ejecutan). Esto es útil para depurar: puedes ver si una expansión produce lo que esperas sin el riesgo de ejecutarla.
Bonus: puedes "comentar" código multilínea con un heredoc:
: << 'COMMENT'
echo "Esta línea está desactivada"
echo "Esta también"
rm -rf /tmp/test
COMMENT
¿Por qué no lo conocías antes?
Porque el : es uno de esos comandos que nadie te enseña. No aparece en tutoriales de bash para principiantes, no lo mencionan en courses de Linux, y la documentación oficial dice literalmente "does nothing" — así que la mayoría lo salta sin pensar.
Pero los devs que han estado en esto por décadas lo usan en silencio, cada día, en cada script que escriben. Es parte de ese conocimiento tribal que solo se transmite cuando ves el código de alguien más experto y piensas "¿qué rayos significa ese ':'?"
La belleza del : es que no necesitas aprender una herramienta nueva. Ya está ahí, en tu shell, desde el primer día. Solo necesitabas que alguien te lo mostrara.
Bonus: la línea más inútil (y genial) que escribirás hoy
Sí, esto es válido y puedes probarlo:
: : : : : : : : : : : : : : : : : : : : :
21 dos puntos. Cada uno es un comando independiente. Hacen exactamente nada. Pero es hermoso.
Comparte esto con ese amigo que todavía escribe if [ -z "$1" ] como un cavernícola. Le vas a cambiar la vida. 🚀