Deseo ejecutar un comando cada 10 segundos y ejecutarlo en segundo plano ( watch¿ eliminando así ?). Todas las respuestas muestran algo como lo siguiente, pero esto se ejecutará cada 11 a 14 segundos. ¿Cómo se puede lograr esto?
while true; do
# perform command that takes between 1 and 4 seconds
sleep 10
done

Respuestas:
Qué tal si:
ETA: con todos esos comentarios, alternativas y la subshell para una protección adicional, parece mucho más complicado de lo que comenzó. Entonces, a modo de comparación, esto es lo que parecía antes de comenzar a preocuparme
waitokillcon su$!necesidad de aislamiento:El resto es realmente solo para cuando lo necesites.
fuente
$!: "Se expande al ID de proceso del trabajo colocado más recientemente en el fondo", ysleepno se coloca en el fondo, por lo que no, no lo hará. :)Usted puede hacer algo como lo siguiente en
bash,zshoksh:Esto es lo
bashque dice el manual sobre$SECONDS:Aquí hay un ejemplo de trabajo:
fuente
SECONDShacersleep "$((10-(($SECONDS-$start_time)%10)))". Tendrás que hacerstart_time=$SECONDSantes del bucle.SECONDS. Generar un sub-shell como en su última edición, también debería evitar este problema.while truebucle, no pensé que se esperaba que ningún estado shell sobreviviera. Ajustar un bucle como ese en su propio contexto suele ser la mejor práctica, de todos modos. Sin embargo, en una situación así, me preocuparía más hacerlo portrapel bien que por$SECONDSel bien.BASH solamente: también puede calcular el tiempo que dedica su comando y restar de 10:
Del hombre BASH:
fuente