Führen Sie ein Programm X-mal aus

18

Wie führe ich ein Programm X-mal im Terminal aus?

Ich habe gelesen, dass ich einen bin / bash txt machen muss, aber ich weiß nicht, wie ich diesen X-mal ausführen soll.

user3597989
quelle
Was ist das, ein Skript, eine Anwendung, was macht es? Was soll im Fehlerfall passieren? schließt es, nachdem es gelaufen ist? sollte überprüft werden, ob es geschlossen hat?
Jacob Vlijm
Es ist nur ein Klick, xdotool click Ich glaube nicht, dass es einen Fehler verursachen kann.
user3597989
@KasiyA: Nicht genau, da all diese Antworten für immer wiederholt werden. Hier fordert das OP eine feste Anzahl von Schleifen an.
Sylvain Pineau
4
Oder Blufter's: askubuntu.com/a/508752/158442 - aber beide gehören nicht dorthin, sondern hierher. : D
muru
2
@KasiyA: Die Antwort von Ask sollte hier nicht in " Befehl alle x Zeitintervalle im Terminal wiederholen" stehen.
Sylvain Pineau

Antworten:

24

Sie können xargsund verwenden seq. Allgemein:

seq nr_of_times_to_repeat | xargs -Iz command

Beispielsweise:

seq 10 | xargs -Iz xdotool click 1

Führt den xdotool click 1Befehl zehnmal aus.

Radu Rădeanu
quelle
1
Dies ist wahrscheinlich die eleganteste Lösung, ganz zu schweigen von der einfachsten.
Seth
Ich denke, das ist ein wirklich gutes Beispiel für die Erklärung des Pipe-Charakters.
PascalVKooten
10

Öffnen Sie ein Terminal und verwenden Sie den folgenden bashBefehl:

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

Mit ein bisschen Ausführlichkeit und 1s Verzögerung:

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
quelle
sintax error with 'do' ..
user3597989
@ user3597989 Es funktioniert bei mir, könntest du das nochmal überprüfen?
Sylvain Pineau
@ user3597989 oh ich weiß, bitte erstmal entfernen $. Es ist nur dazu da, eine Shell-Eingabeaufforderung wie anzugeben sylvain@sylvain-ThinkPad-T430s:~$. Wir fügen es normalerweise zu Befehlszeilenantworten hinzu, um den Befehl von seinen Ergebnissen zu unterscheiden.
Sylvain Pineau
@ user3597989: Ich habe die Shell-Eingabeaufforderung entfernt, um Verwirrung zu vermeiden
Sylvain Pineau
5

Dies sollte tun:

#!/bin/bash

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

Dabei ist 10 die Häufigkeit, mit der der Befehl ausgeführt wird

Wenn Sie eine kleine Pause einplanen müssen:

#!/bin/bash

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

Kopieren Sie das Skript in eine leere Datei, ersetzen Sie es <command to run>durch Ihren xdotoolBefehl, speichern Sie es unter run_xdotool.shund führen Sie es mit dem Befehl aus:

sh /path/to/run_xdotool.sh

Alternativ können Sie es ausführbar machen und es einfach ausführen

/path/to/run_xdotool.sh

Eine andere Lösung: Verwenden der integrierten Wiederholungsoption von xdotool

Da Sie erwähnen, dass es für Klicks verwendet werden soll, ist es möglicherweise am einfachsten, die xdotoolintegrierte Wiederholungsoption zu verwenden. Das Format ist:

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

Der Befehl für 10 Mausklicks (Taste 1) in einer Reihe, eine Sekunde dazwischen, lautet:

xdotool click --delay 1000 --repeat 10 1
Jacob Vlijm
quelle
5

Wenn Sie GNU Parallel haben, können Sie Folgendes ausführen:

seq 10 | parallel -N0 doit

Alle neuen Computer haben mehrere Kerne, aber die meisten Programme sind serieller Natur und verwenden daher nicht die mehreren Kerne. Viele Aufgaben sind jedoch extrem parallelisierbar:

  • Führen Sie das gleiche Programm für viele Dateien aus
  • Führen Sie für jede Zeile in einer Datei dasselbe Programm aus
  • Führen Sie für jeden Block in einer Datei dasselbe Programm aus

GNU Parallel ist ein allgemeiner Parallelisierer, mit dem Sie auf einfache Weise Jobs auf demselben Computer oder auf mehreren Computern, auf die Sie ssh-Zugriff haben, parallel ausführen können.

Wenn Sie 32 verschiedene Jobs auf 4 CPUs ausführen möchten, können Sie auf einfache Weise 8 Jobs auf jeder CPU parallelisieren:

Einfaches Scheduling

GNU Parallel erzeugt stattdessen einen neuen Prozess, wenn man fertig ist - die CPUs aktiv zu halten und damit Zeit zu sparen:

GNU Parallel Scheduling

Installation

Für eine persönliche Installation ist kein Root-Zugriff erforderlich. Dies kann in 10 Sekunden geschehen:

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

Weitere Installationsoptionen finden Sie unter http://git.savannah.gnu.org/cgit/parallel.git/tree/README

Mehr erfahren

Weitere Beispiele finden Sie unter: http://www.gnu.org/software/parallel/man.html

Sehen Sie sich die Intro-Videos an: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

Gehen Sie durch das Tutorial: http://www.gnu.org/software/parallel/parallel_tutorial.html

Melden Sie sich für die E-Mail-Liste an, um Unterstützung zu erhalten: https://lists.gnu.org/mailman/listinfo/parallel

Ole Tange
quelle
1
Ich liebe Parallele und versuche, ihre Verwendung vorzuschlagen, wo immer ich kann. Eine Frage zu Ihrer konkreten Option: Warum haben Sie dieses Formular lieber vorgeschlagen alsparallel -N0 doit ::: {1..10}
Phillip-Zyan K Lee- Stockmann
1
Das {1..10}funktioniert nicht in (t) csh / fish / ash, und das {1..10}Konstrukt ist durch die Länge der Befehlszeile begrenzt, sodass dies nicht funktioniert: {1..1000000000}wohingegen seq 1000000000es gut funktioniert. Aber in den meisten Situationen {1..10}wird es wie erwartet funktionieren, und das nutze ich auch oft.
Ole Tange
4

Sie können eine forSchleife im C-Stil verwenden , die gegenüber der Version mit geschweiften Klammern ( {1..5}) den Vorteil hat , Variablen zum Angeben der Endpunkte verwenden zu können. Beide Versionen sind besser als die Verwendung eines externen Dienstprogramms ( seq).

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

Alles in einer Zeile:

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

Möglicherweise können Sie auch auf eine Schleife verzichten (für dieses spezielle Dienstprogramm und diese Funktion):

xdotool click --repeat 5 --delay 50 1
Bis auf weiteres angehalten.
quelle
0

Sie können einfach den Befehl watch verwenden:

watch -n x <your command>

Ändern Sie x in Zeit in Sekunden.

Beispiel:

watch -n 1 xdotool click 1 

Xdotool click 1 wird also alle 1 s wiederholt und beendet, wenn Sie fertig sind.

nux
quelle
4
Ich denke, die Frage ist spezifisch, wie oft der Befehl ausgeführt wird , nicht so sehr in einem definierten Intervall.
Jacob Vlijm