Si alguna vez has lanzado en la terminal un comando que tarda un buen rato y te has puesto a hacer otra cosa, sabrás lo fácil que es perder la noción del tiempo. Con Undistract-me se acabó eso de volver a la consola cada dos por tres para comprobar si ha terminado: la herramienta muestra una notificación en el escritorio cuando un comando de larga duración finaliza.
Este pequeño script funciona en Debian, Ubuntu y derivados, además de Arch Linux. Por defecto considera “de larga duración” cualquier orden que tarde más de 10 segundos y, salvo que lo cambies, solo te avisa si la ventana activa no es la terminal donde se ejecuta el proceso, justo para evitar distracciones innecesarias cuando ya estás mirando esa ventana.
Qué es Undistract-me y cómo funciona
Undistract-me es básicamente un conjunto de funciones de shell que se enganchan al ciclo de ejecución de Bash (y también puede integrarse en Zsh) para detectar cuándo comienza y cuándo termina un comando. Cuando el tiempo de ejecución supera un umbral configurable, dispara una notificación de escritorio y, si quieres, un sonido de aviso.
Por diseño, el script define un timeout por defecto de 10 segundos a partir del cual un comando se considera “largo”. Este valor se puede modificar y también se puede crear una lista de exclusión con nombres de comandos que no deberían generar avisos (por ejemplo, ls o cd si los has personalizado y a veces tardan).
Otra decisión importante de su funcionamiento es la comprobación de ventana activa: solo muestra la notificación si no estás con la terminal en primer plano. Si prefieres que te avise igualmente, hay una variable de entorno para invertir ese comportamiento.
El proyecto está abierto y su código se publica bajo licencia Expat. Históricamente, el desarrollo lo inició jml y se aloja en plataformas como Launchpad y GitHub. Bajo el capó usa un conocido “hack” de preexec para Bash (inspirado en el trabajo de Glyph Lefkowitz) y ha recibido contribuciones de gente como Chris Jones (Terminator), Mikey Neuling y Stephen Rothwell, que mejoraron su rendimiento y calidad.

Instalación en Debian, Ubuntu y derivadas
La forma más directa en sistemas Debian/Ubuntu es a través de los repositorios estándar. Basta con instalar el paquete y lo tendrás todo listo para enlazarlo con tu shell.
sudo apt update
sudo apt install undistract-me
En versiones muy antiguas de Ubuntu hubo un PPA específico, por si trabajas con entornos heredados donde apt no disponga de este paquete actualizado:
sudo add-apt-repository ppa:undistract-me-packagers/daily
sudo apt update
sudo apt install undistract-me
Una vez instalado, hay que “enganchar” el script a tu shell. En Bash tienes varias opciones. La más simple añade una línea de carga automática al archivo de inicio:
echo 'source /etc/profile.d/undistract-me.sh' >> ~/.bashrc
Si prefieres la instalación explícita del componente principal más el instalador de ganchos, también puedes escribir las dos líneas en tu ~/.bashrc de esta manera:
echo "source /usr/share/undistract-me/long-running.bash
notify_when_long_running_commands_finish_install" >> ~/.bashrc
Y recuerda refrescar la sesión de shell para aplicar los cambios con un source tras la modificación de los archivos de inicio.
source ~/.bashrc
Instalación en Arch Linux y derivadas (AUR)
En el ecosistema Arch, Undistract-me está disponible en AUR (normalmente en la variante undistract-me-git). Puedes compilarlo con tu ayudante de AUR favorito o a mano con makepkg. A modo orientativo, estos son comandos habituales de helpers que muchos usuarios conocen:
pacaur -S undistract-me-git
packer -S undistract-me-git
yaourt -S undistract-me-git
Ten presente que algunos de esos helpers están obsoletos, pero sirven para ilustrar que la instalación se realiza desde el repositorio comunitario. En cualquier caso, una vez instalado, la activación para tu shell se hace como en Debian/Ubuntu: añadiendo las líneas correspondientes a tu archivo de inicio.
Activación y uso con Bash y Zsh
Para Bash, además de las variantes mostradas arriba, existe un bloque compacto que podrás incluir al final de ~/.bashrc para que se cargue el script cuando proceda:
if ! [ -z "$BASH_VERSION" -o -z "$PS1" -o -n "$last_command_started_cache" ]; then
. /usr/share/undistract-me/long-running.bash
notify_when_long_running_commands_finish_install
fi
En Zsh, la integración se consigue de forma similar, apuntando las mismas líneas al archivo ~/.zshrc. Puedes volcarlo de una vez con este comando:
echo "source /usr/share/undistract-me/long-running.bash
notify_when_long_running_commands_finish_install" >> ~/.zshrc
Tras editar cualquiera de estos archivos, recarga la configuración de tu shell actual para que los cambios tengan efecto sin cerrar sesión.
source ~/.bashrc
# o bien para Zsh
env zsh -l
# alternativamente
a source ~/.zshrc
Importante: en muchos emuladores de terminal deberás habilitar la opción “Ejecutar el comando como shell de inicio de sesión”. En GNOME Terminal está en Preferencias del perfil > Título y comando; en XFCE Terminal la encontrarás en Preferencias > General; y en Guake está en Preferencias > General. Sin esto, el hook puede no cargarse bien.

Configuración: tiempo, exclusiones, ventana activa y sonido
Undistract-me se controla principalmente desde el archivo /usr/share/undistract-me/long-running.bash y mediante variables de entorno. Puedes abrir ese archivo con tu editor favorito y revisar los parámetros disponibles.
Para cambiar el tiempo mínimo a partir del cual un comando se considera “largo”, localiza la variable LONG_RUNNING_COMMAND_TIMEOUT. El valor por defecto es 10 (segundos), pero puedes poner lo que te encaje.
sudo nano /usr/share/undistract-me/long-running.bash
# Busca y ajusta:
# LONG_RUNNING_COMMAND_TIMEOUT=10
Si quieres que ciertos comandos nunca disparen notificación, añade sus nombres separados por espacios a la variable LONG_RUNNING_IGNORE_LIST. Es útil para filtrar utilidades que usas constantemente y no quieres que te interrumpan.
Por otro lado, si deseas recibir avisos incluso cuando la terminal sea la ventana activa, define IGNORE_WINDOW_CHECK=1. Con ello, la comprobación se desactiva y siempre verás el aviso al finalizar el comando largo.
Para incorporar un aviso sonoro, ajusta la variable UDM_PLAY_SOUND a un entero distinto de cero. En sistemas Debian/Ubuntu, esta función requiere tener instalados pulseaudio-utils y sound-theme-freedesktop, ya que se apoya en el tema de sonidos del escritorio.
sudo apt install pulseaudio-utils sound-theme-freedesktop
Tras cualquier cambio en el archivo de configuración o en variables de entorno, no olvides recargar tu shell:
source ~/.bashrc
# o
source ~/.zshrc
Pruebas rápidas para comprobar que funciona
La forma más sencilla de verificarlo es lanzar un comando que tarde más de 10 segundos (o el umbral que hayas configurado). Por ejemplo, puedes hacer un ping a un host de tu red o al exterior con un número de paquetes suficiente como para sobrepasar el tiempo.
ping -c 25 1.1.1.1
En entornos Arch también es muy visual usar una orden como sudo pacman -Sy, que suele tardar lo suyo dependiendo del estado de los espejos:
sudo pacman -Sy
Recuerda dos cosas clave: la notificación aparece cuando el comando ha tardado por encima del umbral y, por defecto, solo si la ventana activa no es la terminal en la que se ejecuta. Si el proceso termina antes del timeout, no verás mensaje; si te interesa recibirlo igualmente, ajusta el valor de LONG_RUNNING_COMMAND_TIMEOUT o desactiva la verificación de ventana con IGNORE_WINDOW_CHECK.
Alternativas rápidas sin instalar nada extra
Aunque Undistract-me es muy cómodo, hay soluciones minimalistas que puedes usar solo cuando te interese. Con notify-send (suele venir por defecto en muchos escritorios) puedes añadir un aviso al final de tu comando:
cat archivo && notify-send '¡Terminado!'
Si prefieres un cuadro de diálogo más visible, Zenity es otra opción típica en entornos GTK. El patrón de uso es igual de simple y te saca una ventana informativa al concluir:
cat archivo && zenity --info --text='Proceso finalizado.'
Truco rápido: en lugar de && (que solo ejecuta la segunda parte si la primera tiene éxito), puedes encadenar con ; para que la notificación salga pase lo que pase. Úsalo con cuidado según el caso.
Existen más alternativas y complementos: desde herramientas como NotiFyre hasta terminales con avisos integrados (por ejemplo, Tilix puede notificar cuando el panel no está activo). Si quieres algo de audio extra y vas a lo básico, una opción casera es encadenar un aviso de voz:
foo; spd-say 'tarea completada'
Y, para quienes aún usen el altavoz del sistema, hay quien habilita pcspkr con un beep tras las tareas largas. Es tosco, pero efectivo en entornos muy mínimos.
Consejos de uso y solución de problemas
Si no recibes notificaciones, el primer punto a revisar es si has activado la opción de “shell de inicio de sesión” en tu emulador de terminal. Sin ese ajuste, la carga de Undistract-me puede no producirse y el gancho no se instala.
Comprueba también que tu shell está leyendo el archivo correcto (~/.bashrc o ~/.zshrc) y que has hecho source tras editarlo. Añade una línea de depuración (por ejemplo, un echo) para confirmar que el archivo se ejecuta al iniciar la sesión de terminal.
Si activas el sonido y no se escucha nada, verifica la presencia de pulseaudio-utils y del paquete sound-theme-freedesktop, además del volumen y el servidor de audio en tu sesión. En escritorios muy minimalistas, puede ser necesario iniciar PulseAudio manualmente o usar otro backend.
¿Demasiados avisos por comandos triviales? Ajusta LONG_RUNNING_COMMAND_TIMEOUT a un valor más alto y rellena LONG_RUNNING_IGNORE_LIST con alias y utilidades que no quieras monitorizar (por ejemplo, git status o docker ps si los repites mucho).
Detalles del proyecto y comunidad
El código de Undistract-me se distribuye bajo licencia Expat y ha vivido tanto en Launchpad como en GitHub. No cuenta con un canal IRC dedicado, aunque tradicionalmente se ha podido encontrar a jml en el ecosistema de Freenode (en su día, en #ubuntu-devel). Para dudas o errores, el cauce adecuado son los issues del repositorio o el proyecto en Launchpad.
Una mención curiosa para quienes disfrutan de los engranajes internos: el soporte de preexec tipo Zsh en Bash no es nativo, de modo que el script emplea un “hack” inteligente que dispara funciones antes y después de cada comando. Gracias a contribuciones como las de Chris Jones (del terminal Terminator) y optimizaciones de Mikey Neuling y Stephen Rothwell, el rendimiento ha mejorado mucho respecto a las primeras versiones.
En el día a día, la herramienta encaja especialmente bien cuando compilas, conviertes multimedia, sincronizas grandes cantidades de datos o ejecutas operaciones de paquetería que tardan. El patrón es siempre el mismo: lanza el comando, cambia de ventana y deja que el escritorio te avise cuando termine.
Undistract-me aporta justo lo que promete: menos tiempo mirando la consola y más foco en lo que estés haciendo. Su instalación es sencilla, se afina con un par de variables y se integra bien en Bash y Zsh, lo que lo convierte en un imprescindible para quienes pasamos media vida en la terminal.