Estoy tratando de encontrar una manera simple de seguir ejecutando un comando cada vez que termina, por cualquier motivo (error u otro).
¿Cuál sería la mejor manera de abordar esto?
EDITAR: No estaba lo suficientemente claro antes. Necesito la próxima ejecución para esperar hasta que termine la anterior.
EDIT 2: Casi todas las respuestas funcionan muy bien. Pensé erróneamente que la mayoría de las respuestas bifurcarían el proceso o lo volverían a ejecutar solo una vez, ninguna de las cuales es deseada.
Respuestas:
Esto crea un bucle infinito, ejecutándose
command
una y otra vez.fuente
while true; do echo 'Hit CTRL+C'; sleep 1; done
gracias a cyberciti.biz/faq/bash-infinite-loop~~V~~plural~~3rdEl
watch
comando repetirá un comando para siempre con un intervalo especificado:Establecer
-n
a cero efectivamente no pone el intervalo en nada (creo que es realmente .1 segundos).watch
También tiene los beneficios adicionales de alinear la salida para que los cambios visuales se puedan ver fácilmente, y tiene un interruptor para resaltar los cambios de la última ejecución.Referencia: la página del manual del reloj :
fuente
watch ls
en un directorio que contiene archivos, no obtienes nada?Una solución simple sería:
;
separa los comandos, permitiendo múltiples comandos en una línea ( Bash: Listas )!#
le dice a bash que "repita todo lo que he escrito hasta ahora en esta línea" ( Bash: Designadores de eventos )fuente
yourcommand; !!
realidad no funciona con comandos en la misma línea, sin embargo,!#
parece funcionar. ¡Salud!; !#
no funcionó en ZSH, solo expande la declaración esencialmente clonándola, no laPuede planificar con anticipación durante la ejecución del comando (siempre que no sea interactivo) e ingresar
!!
cuál ejecutará el comando anterior nuevamente. Esto funciona, por ejemplo, duranteping -c 5
.También puede definir una función en
bash
:Para persistir, guárdelo
~/.bashrc
.Entonces, puedes ejecutar tu comando así:
Si es un comando específico que desea ejecutar repetidamente (y no, por ejemplo, cualquier comando), puede reemplazar
"$@"
ese fragmento con su comando real y nombrar la función, por ejemplo, en surepeat_ping
lugar.Para que sea un bucle infinito, puedes hacer lo que @Dennis sugiere. Le recomiendo que agregue un período de espera si tiene la intención de usar esto en un shell interactivo, como este:
De lo contrario, es bastante inconveniente abortar este bucle infinito usando
Ctrl-Z
.fuente
Dele a un
while
bucle una condición booleana como la siguiente:Esto se ejecutará una y otra vez hasta que bash reciba una señal para finalizar el proceso. Por lo general, en forma de
ctrl+c
.También puede usar el
watch
comando para ejecutar un script repetidamente también. Por ejemplo, un reloj simple en su terminal bash usandowatch
podría verse así:La
-t
opción le indicawatch
que no muestre un título del proceso que está ejecutando. Esto le da una salida limpia de solo el comando que se repite. La-n1
opción le dice al reloj que se repita cadan
segundo. En este caso,-n1
habrá intervalos de1
segundo. Luego eldate +%T
comando muestra la hora en el momento de la finalización del comando. Hacer este comando te dará un reloj activo en tu terminal.Y luego, un método más que no está en ninguna de las otras respuestas sería una llamada a función infinita.
Esto es esencialmente lo mismo que el
while
bucle booleano que solo usa llamadas a funciones recursivas.(editar) Para tener en cuenta los recursos de su máquina, he agregado el de
&& wait
modo que cada vez que se ejecuta un proceso, los bucles "esperarán" hasta que ese proceso finalice con el estado de salida 0 antes de la siguiente iteración. Esto es útil en un script de shell interactivo.fuente
while
ejemplo de bucle pero no está usando unatrue
sintaxis booleana . Hay unwatch
ejemplo, pero no ofrece muchas sintaxis útiles. Estoy exponiendo sobre estos para quien pueda ayudar. Quería darles una utilidad práctica a estos. Elwhile
bucle booleano también puede serfalse
y no ejecutarse hasta que se cumpla una condición falsa. Es bastante útil.if
sigue ejecutando de nuevo?if
declaración.Este es otro método que uso para repetir un comando en bash. Esto puede sonar tonto para algunos, ya que no implica escribir un guión y puede ser conocido por muchos. Pero creo que vale la pena mencionarlo, ya que es rápido y amigable para principiantes, en el sentido de que no hay mucha sintaxis para recordar. Solo he probado esto en gnome-terminal de Ubuntu y es posible que otros terminales no lo admitan.
No tiene que esperar para pegar hasta que finalice cada comando. Los comandos pegados entran en una cola y se ejecutan uno tras otro.
fuente
Me siento descarado hoy.
Leer de una de las corrientes infinitas y canalizarlo a
xargs
Si necesita poner un poco de descanso allí, es probable que deba ejecutar
sh
fuente