Uruchom program X razy

18

Jak wykonać program X razy w terminalu?

Czytam, że muszę zrobić bin / bash txt, ale nie wiem, jak wykonać X razy.

użytkownik3597989
źródło
co to jest, skrypt, aplikacja, co ona robi? co powinno się stać w przypadku błędów? czy zamyka się po uruchomieniu? czy należy to sprawdzić, czy zostało zamknięte?
Jacob Vlijm
to tylko kliknięcie, kliknięcie xdotool Nie sądzę, że może to spowodować błąd.
user3597989
@KasiyA: Nie do końca, ponieważ wszystkie te odpowiedzi zapętlają się na zawsze. Tutaj OP prosi o ustaloną liczbę pętli.
Sylvain Pineau
4
Lub Bluftera: askubuntu.com/a/508752/158442 - ale oba nie należą tam, ale tutaj. : D
muru
2
@KasiyA: Odpowiedź Ask nie powinna być tutaj. Powtarzać polecenie co x odstęp czasu w terminalu?
Sylvain Pineau,

Odpowiedzi:

24

Możesz użyć xargsi seq. Ogólnie:

seq nr_of_times_to_repeat | xargs -Iz command

Na przykład:

seq 10 | xargs -Iz xdotool click 1

wykona xdotool click 1polecenie 10 razy.

Radu Rădeanu
źródło
1
Jest to prawdopodobnie najbardziej eleganckie rozwiązanie, nie mówiąc już o najprostszym.
Seth
Myślę, że to naprawdę dobry przykład na wyjaśnienie postaci fajki.
PascalVKooten
10

Otwórz terminal i użyj następującego bashpolecenia:

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

Z odrobiną gadatliwości i opóźnieniem 1s:

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
źródło
błąd sintax z „do” ..
user3597989
@ user3597989 Działa dla mnie, czy możesz to sprawdzić ponownie?
Sylvain Pineau,
@ user3597989 oh wiem, proszę usunąć pierwszy $. Jest tylko tam, aby wskazać znak zachęty powłoki sylvain@sylvain-ThinkPad-T430s:~$. Zazwyczaj dodajemy go do odpowiedzi z wiersza poleceń, aby odróżnić polecenie od jego wyników.
Sylvain Pineau,
@ user3597989: Usunąłem monit powłoki, aby uniknąć pomyłek
Sylvain Pineau,
5

To powinno zrobić:

#!/bin/bash

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

gdzie 10 to liczba uruchomień polecenia

jeśli chcesz zbudować małą przerwę:

#!/bin/bash

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

Skopiuj skrypt do pustego pliku, zastąp <command to run>go xdotoolpoleceniem, zapisz jako run_xdotool.sh, uruchom go poleceniem:

sh /path/to/run_xdotool.sh

Alternatywnie możesz uczynić go wykonywalnym i po prostu uruchomić

/path/to/run_xdotool.sh

Inne rozwiązanie: użycie wbudowanej opcji powtarzania xdotool

Ponieważ wspomniałeś o używaniu go do robienia kliknięć, najłatwiej może być użyć xdotoolwłasnej wbudowanej opcji powtarzania. Format to:

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

Aby wykonać 10 kliknięć myszką (przycisk 1) w rzędzie, jedna sekunda pomiędzy nimi, polecenie:

xdotool click --delay 1000 --repeat 10 1
Jacob Vlijm
źródło
5

Jeśli masz GNU Parallel, możesz uruchomić:

seq 10 | parallel -N0 doit

Wszystkie nowe komputery mają wiele rdzeni, ale większość programów ma charakter szeregowy i dlatego nie będzie używać wielu rdzeni. Jednak wiele zadań można bardzo zrównoleglać:

  • Uruchom ten sam program na wielu plikach
  • Uruchom ten sam program dla każdej linii w pliku
  • Uruchom ten sam program dla każdego bloku w pliku

GNU Parallel to ogólny paralelizator, który ułatwia równoległe uruchamianie zadań na tej samej maszynie lub na wielu maszynach, do których masz dostęp ssh.

Jeśli masz 32 różne zadania, które chcesz uruchomić na 4 procesorach, prostym sposobem na zrównoleglenie jest uruchomienie 8 zadań na każdym procesorze:

Proste planowanie

Zamiast tego GNU Parallel odradza nowy proces po zakończeniu - utrzymując procesory aktywne, a tym samym oszczędzając czas:

Planowanie równoległe GNU

Instalacja

Instalacja osobista nie wymaga dostępu do konta root. Można to zrobić w 10 sekund, wykonując następujące czynności:

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

Inne opcje instalacji można znaleźć na stronie http://git.savannah.gnu.org/cgit/parallel.git/tree/README

Ucz się więcej

Zobacz więcej przykładów: http://www.gnu.org/software/parallel/man.html

Obejrzyj filmy wprowadzające: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

Przejrzyj samouczek: http://www.gnu.org/software/parallel/parallel_tutorial.html

Zarejestruj się, aby uzyskać listę e-mail, aby uzyskać pomoc: https://lists.gnu.org/mailman/listinfo/parallel

Ole Tange
źródło
1
Uwielbiam równolegle i staram się sugerować jego użycie, gdzie tylko mogę. Jedno pytanie dotyczy twojej konkretnej opcji: dlaczego wolałeś zaproponować ten formularz zamiastparallel -N0 doit ::: {1..10}
Phillip -Zyan K Lee- Stockmann
1
{1..10}Nie działa w (t) csh / ryb / popiół, a {1..10}konstrukt jest ograniczona przez długość linii polecenia, zatem nie będzie działać: {1..1000000000}natomiast seq 1000000000będzie działać prawidłowo. Ale w większości sytuacji {1..10}będzie działać zgodnie z oczekiwaniami, a ja często tego używam.
Ole Tange
4

Można użyć forpętli w stylu C, która ma tę przewagę nad wersją nawiasów klamrowych ( {1..5}), że może używać zmiennych do określania punktów końcowych. Każda wersja jest lepsza niż użycie zewnętrznego narzędzia ( seq).

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

Wszystko w jednej linii:

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

Lub możesz to zrobić bez pętli (dla tego konkretnego narzędzia i funkcji):

xdotool click --repeat 5 --delay 50 1
Wstrzymano do odwołania.
źródło
0

Po prostu możesz użyć polecenia obserwuj:

watch -n x <your command>

zmień x na czas w sekundach.

Przykład:

watch -n 1 xdotool click 1 

Tak więc xdotool kliknięcie 1 będzie powtarzane co 1 s, zakończ je po zakończeniu.

nux
źródło
4
Myślę, że pytanie dotyczy konkretnego uruchomienia polecenia określoną liczbę razy , nie tyle w określonym przedziale czasowym.
Jacob Vlijm