Ejecuta un programa X veces


18

¿Cómo ejecuto un programa X veces en el terminal?

Leí que tengo que hacer un bin / bash txt, pero no sé cómo ejecutar esto X veces.


¿Qué es, un script, una aplicación, qué hace? ¿Qué debería pasar en caso de errores? ¿se cierra después de que se ejecutó? ¿Debería comprobarse si se ha cerrado?
— Jacob Vlijm

es solo un clic, clic en xdotool No creo que pueda crear un error.
— user3597989

@KasiyA: No exactamente, ya que todas esas respuestas se repiten para siempre. Aquí el OP solicita un número fijo de bucles.
— Sylvain Pineau

44
O Blufter: askubuntu.com/a/508752/158442 , pero ambos no pertenecen allí, sino aquí. : D
— muru

2
@KasiyA: La respuesta de Ask debería estar aquí, no en ¿ Repetir un comando cada x intervalo de tiempo en la terminal?
— Sylvain Pineau

Respuestas:


24

Puedes usar xargsy seq. En general:

seq nr_of_times_to_repeat | xargs -Iz command

Por ejemplo:

seq 10 | xargs -Iz xdotool click 1

ejecutará el xdotool click 1comando por 10 veces.


1
Esta es probablemente la solución más elegante, sin mencionar la más simple.
— Seth

Creo que este es un muy buen ejemplo para explicar el carácter de la tubería.
— PascalVKooten

10

Abra una Terminal y use el siguiente bashcomando:

for i in {1..5}; do xdotool click 1; done

Con un poco de verbosidad y 1s de retraso:

for i in {1..5}; do echo click \#$i && xdotool click 1 && sleep 1; done
click #1
click #2
click #3
click #4
click #5

error de sintax con 'do' ..
— user3597989

@ user3597989 Funciona para mí, ¿podría verificar de nuevo?
— Sylvain Pineau

@ user3597989 oh, lo sé, elimine el primero $. Solo está ahí para indicar un indicador de shell como sylvain@sylvain-ThinkPad-T430s:~$. Por lo general, lo agregamos a las respuestas de la línea de comandos para diferenciar el comando de sus resultados.
— Sylvain Pineau

@ user3597989: eliminé el indicador de shell para evitar confusiones
— Sylvain Pineau el

5

Esto debería hacer:

#!/bin/bash

x=1
while [ $x -le 10 ]
do
  <command to run>
  x=$(( $x + 1 ))
done

donde 10 es el número de veces que se ejecuta el comando

Si necesita construir en un pequeño descanso:

#!/bin/bash

x=1
while [ $x -le 10 ]
do
  <command to run>
  sleep 1
  x=$(( $x + 1 ))
done

Copie el script en un archivo vacío, reemplácelo <command to run>por su xdotoolcomando, guárdelo como run_xdotool.sh, ejecútelo por el comando:

sh /path/to/run_xdotool.sh

Alternativamente, puede hacerlo ejecutable y simplemente ejecutarlo

/path/to/run_xdotool.sh

Otra solución: usar la opción de repetición integrada de xdotool

Como menciona usarlo para hacer clics, lo más fácil podría ser usar xdotoolla opción de repetición incorporada. El formato es:

xdotool click --delay <delay> --repeat <repeats> <button>
(delay in milliseconds between the clicks)

Para hacer 10 clics del mouse (botón 1) seguidos, un segundo en el medio, el comando es:

xdotool click --delay 1000 --repeat 10 1

5

Si tiene GNU Parallel puede ejecutar:

seq 10 | parallel -N0 doit

Todas las computadoras nuevas tienen múltiples núcleos, pero la mayoría de los programas son de naturaleza serial y por lo tanto no usarán los múltiples núcleos. Sin embargo, muchas tareas son extremadamente paralelizables:

  • Ejecute el mismo programa en muchos archivos
  • Ejecute el mismo programa para cada línea en un archivo
  • Ejecute el mismo programa para cada bloque en un archivo

GNU Parallel es un paralelizador general y hace que sea fácil ejecutar trabajos en paralelo en la misma máquina o en múltiples máquinas a las que tiene acceso ssh.

Si tiene 32 trabajos diferentes que desea ejecutar en 4 CPU, una forma directa de paralelizar es ejecutar 8 trabajos en cada CPU:

Programación simple

GNU Parallel genera un nuevo proceso cuando uno termina, manteniendo las CPU activas y ahorrando así tiempo:

Programación paralela de GNU

Instalación

Una instalación personal no requiere acceso de root. Se puede hacer en 10 segundos haciendo esto:

(wget -O - pi.dk/3 || curl pi.dk/3/ || fetch -o - http://pi.dk/3) | bash

Para otras opciones de instalación, consulte http://git.savannah.gnu.org/cgit/parallel.git/tree/README

Aprende más

Ver más ejemplos: http://www.gnu.org/software/parallel/man.html

Mira los videos de introducción: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

Recorre el tutorial: http://www.gnu.org/software/parallel/parallel_tutorial.html

Regístrese en la lista de correo electrónico para obtener asistencia: https://lists.gnu.org/mailman/listinfo/parallel


1
Me encanta el paralelo y trato de sugerir su uso siempre que puedo. Una pregunta para su opción específica: ¿por qué parallel -N0 doit ::: {1..10}
— prefirió

1
El {1..10}no funciona en (t) csh / fish / ash, y la {1..10}construcción está limitada por la longitud de la línea de comando, por lo que esto no funcionará: {1..1000000000}mientras seq 1000000000que funcionará bien. Pero para la mayoría de las situaciones {1..10}funcionará como se espera, y a menudo también lo uso.
— Ole Tange

4

Puede usar un forbucle de estilo C que tiene la ventaja sobre la versión de expansión de llaves ( {1..5}) de poder usar variables para especificar los puntos finales. Cualquiera de las versiones es mejor que usar una utilidad externa ( seq).

t=5
for ((x = 1; x <= t; x++))
do
    xdotool click 1
done

Todo en una línea:

t=5; for ((x = 1; x <= t; x++)); do xdotool click 1; done

O podría hacerlo sin un bucle (para esta utilidad y función específica):

xdotool click --repeat 5 --delay 50 1

0

Simplemente puedes usar el comando watch:

watch -n x <your command>

cambie x al tiempo en segundos.

Ejemplo:

watch -n 1 xdotool click 1 

Entonces xdotool click 1 se repetirá cada 1 s, finalícelo cuando haya terminado.


44
Creo que la pregunta es específica al ejecutar el comando un número definido de veces , no tanto en un intervalo definido.
— Jacob Vlijm
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.