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
commanduna y otra vez.fuente
while true; do echo 'Hit CTRL+C'; sleep 1; donegracias a cyberciti.biz/faq/bash-infinite-loop~~V~~plural~~3rdEl
watchcomando repetirá un comando para siempre con un intervalo especificado:Establecer
-na cero efectivamente no pone el intervalo en nada (creo que es realmente .1 segundos).watchTambié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 lsen 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_pinglugar.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
whilebucle 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
watchcomando para ejecutar un script repetidamente también. Por ejemplo, un reloj simple en su terminal bash usandowatchpodría verse así:La
-topción le indicawatchque no muestre un título del proceso que está ejecutando. Esto le da una salida limpia de solo el comando que se repite. La-n1opción le dice al reloj que se repita cadansegundo. En este caso,-n1habrá intervalos de1segundo. Luego eldate +%Tcomando 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
whilebucle booleano que solo usa llamadas a funciones recursivas.(editar) Para tener en cuenta los recursos de su máquina, he agregado el de
&& waitmodo 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
whileejemplo de bucle pero no está usando unatruesintaxis booleana . Hay unwatchejemplo, pero no ofrece muchas sintaxis útiles. Estoy exponiendo sobre estos para quien pueda ayudar. Quería darles una utilidad práctica a estos. Elwhilebucle booleano también puede serfalsey no ejecutarse hasta que se cumpla una condición falsa. Es bastante útil.ifsigue ejecutando de nuevo?ifdeclaració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
xargsSi necesita poner un poco de descanso allí, es probable que deba ejecutar
shfuente