HOWTO · Bash
Cómo pausar un script de Bash durante X segundos
Aprende a pausar un script de Bash durante un tiempo o hasta recibir entrada del usuario con sleep y read
En esta página
Un script de Bash puede hacer una pausa para dar tiempo a alguien a leer un mensaje, esperar una entrada interactiva o dejar pasar un intervalo entre comandos. Usa sleep para una espera de segundos enteros y read cuando el script deba esperar una entrada. Estas pausas controlan cuándo continúa el script; una demora no coordina el acceso a archivos compartidos.
Pausar un script de Bash durante X segundos
Usa sleep con un número entero de segundos para retrasar el siguiente comando. La duración es obligatoria. La página del manual de sleep describe el comando; la compatibilidad con valores fraccionarios o sufijos de duración depende de la implementación de sleep instalada en el sistema.
Este script completo de Bash muestra un mensaje, espera un segundo y luego muestra otro:
#!/usr/bin/env bash
printf '%s\n' 'The script is starting.'
sleep 1
printf '%s\n' 'One second wait requested.'
La demora solicitada es un objetivo, no una garantía de que transcurra exactamente ese tiempo: la planificación del sistema puede alargar la espera real. Para repetir una acción después de una pausa de segundos enteros, coloca la acción y sleep dentro de un bucle. Limita el bucle a esa acción para que cada repetición tenga un efecto claro.
Pausar un script de Bash durante un tiempo variable
Guarda la duración en segundos enteros en una variable y entrecomilla su expansión al pasarla a sleep. Este script usa cinco segundos de forma predeterminada; define N en el entorno para elegir otro valor:
#!/usr/bin/env bash
N=${N:-5}
sleep "$N"
printf 'Requested a %s-second wait.\n' "$N"
Por ejemplo, N=8 ./your-script.sh establece el valor para una sola ejecución. El valor debe ser una duración válida para el comando sleep instalado. Las comillas evitan la división de palabras y la expansión de nombres de archivo, pero no convierten cualquier entrada en una duración válida; valida primero los valores que provengan de usuarios u otras fuentes no confiables.
En Bash, puedes limitar una demora aleatoria de segundos enteros reduciendo $RANDOM a un intervalo. El siguiente script solicita una espera de entre uno y tres segundos:
#!/usr/bin/env bash
delay=$((1 + RANDOM % 3))
printf 'Requested a %s-second wait.\n' "$delay"
sleep "$delay"
Una demora aleatoria puede hacer que distintas ejecuciones del script comiencen en momentos diferentes, pero no garantiza que dos ejecuciones eviten escribir en el mismo archivo a la vez. Si los scripts comparten recursos, usa un mecanismo adecuado de bloqueo o coordinación.
Pausar un script de Bash hasta recibir una entrada del usuario
El comando read de Bash espera una línea en la entrada estándar. En una terminal interactiva, el usuario normalmente completa la línea al pulsar Intro. Usa -r para conservar las barras invertidas de la entrada y -p para mostrar un mensaje:
#!/usr/bin/env bash
if read -r -p 'Press Enter to continue: ' reply; then
printf '%s\n' 'Continuing.'
else
printf '%s\n' 'No input line was available.'
fi
Este patrón espera una entrada interactiva y puede quedarse esperando indefinidamente. Si la entrada estándar llega al final del archivo o está redirigida, read puede terminar sin recibir una línea; comprobar su estado permite al script gestionar ese caso. La referencia de Bash para read documenta sus opciones y comportamiento.
Combinar pausas temporizadas con pausas para recibir entrada
Usa read -t de Bash cuando quieras que la entrada termine la espera antes de tiempo y que el vencimiento del plazo también permita continuar al script. El plazo se expresa en segundos, y la planificación del sistema puede alargar el tiempo transcurrido. Este ejemplo indica qué evento permitió que el script continuara:
#!/usr/bin/env bash
if read -r -t 5 -p 'Continue now, or wait for the timeout: ' reply; then
printf '%s\n' 'Input received; continuing.'
else
printf '%s\n' 'No line was read before the wait ended; continuing.'
fi
Para permitir que el usuario elija una demora de segundos enteros, lee el valor en una variable y pásalo entre comillas a sleep. Esta versión comprueba que sea un número corto antes de llamar a sleep y avisa si no hay una línea adecuada disponible:
#!/usr/bin/env bash
if read -r -p 'Enter a whole number of seconds (up to 3 digits): ' duration \
&& [[ $duration =~ ^[0-9]{1,3}$ ]]; then
sleep "$duration"
printf 'Requested a %s-second wait.\n' "$duration"
else
printf '%s\n' 'Enter a whole number with at most 3 digits.'
fi
El valor se comprueba antes de pasarlo a sleep, lo que evita enviar texto mal formado como duración. Ajusta el intervalo aceptado si el script necesita otros límites y explícaselos a sus usuarios.
En resumen, usa sleep para una demora temporizada de segundos enteros y read para esperar una entrada. read -t de Bash combina ambos métodos: termina la espera cuando llega una línea o vence el plazo.