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.

usuario3597989
fuente
¿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.

Radu Rădeanu
fuente
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
Sylvain Pineau
fuente
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
Jacob Vlijm
fuente
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

Ole Tange
fuente
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
Pausado hasta nuevo aviso.
fuente
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.

nux
fuente
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