Запустіть програму X разів


18

Як виконати програму X разів у терміналі?

Я читав, що я повинен робити bin / bash txt, але не знаю, як виконати цей X раз.


що це, сценарій, додаток, що це робить? що має статися у випадку помилок? вона закривається після того, як вона бігла? чи слід перевіряти, чи закрився він?
Яків Влійм

це лише клацання, натисніть xdotool. Я не думаю, що це може створити помилку.
користувач3597989

@KasiyA: Не зовсім так, як усі ці відповіді цикли назавжди. Тут ОП запитує фіксовану кількість петель.
Sylvain Pineau

4
Або Blufter's: askubuntu.com/a/508752/158442 - але вони обидва не там, а тут. : D
muru

2
@KasiyA: Відповідь запитання повинна бути тут, а не в команді Повторювати команду кожні х інтервал часу в терміналі?
Сільвейн Пано

Відповіді:


24

Ви можете використовувати xargsі seq. Як правило:

seq nr_of_times_to_repeat | xargs -Iz command

Наприклад:

seq 10 | xargs -Iz xdotool click 1

виконає xdotool click 1команду 10 разів.


1
Це, мабуть, найвишуканіше рішення, не кажучи вже про найпростіше.
Сет

Я думаю, що це справді хороший приклад для пояснення характеру труби.
PascalVKooten

10

Відкрийте термінал і скористайтеся такою bashкомандою:

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

З невеликою багатослівністю та затримкою 1 секунди:

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

помилка
sintax

@ user3597989 Це працює для мене, ви можете перевірити ще раз?
Сільвейн Пано

@ user3597989 о, я знаю, видаліть перше $. Це просто там, щоб вказати підказку оболонки типу sylvain@sylvain-ThinkPad-T430s:~$. Зазвичай ми додаємо його до відповідей командного рядка, щоб відрізняти команду від її результатів.
Sylvain Pineau

@ user3597989: Я видалив підказку для оболонки, щоб уникнути плутанини
Sylvain Pineau,

5

Це слід зробити:

#!/bin/bash

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

де 10 - кількість разів для виконання команди

якщо вам потрібно побудувати в невеликій перерві:

#!/bin/bash

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

Скопіюйте скрипт у порожній файл, замініть <command to run>його xdotoolкомандою, збережіть як run_xdotool.sh, запустіть його командою:

sh /path/to/run_xdotool.sh

Крім того, ви можете зробити його виконуваним і просто запустити його

/path/to/run_xdotool.sh

Ще одне рішення: використання вбудованої опції повторення xdotool

Оскільки ви згадуєте його використовувати для здійснення кліків, найпростішим може бути xdotoolвласний вбудований варіант повторення. Формат:

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

Щоб зробити 10 клацань миші (кнопка 1) підряд, одна секунда між ними, команда:

xdotool click --delay 1000 --repeat 10 1

5

Якщо у вас є паралель GNU, ви можете запустити:

seq 10 | parallel -N0 doit

Усі нові комп’ютери мають декілька ядер, але більшість програм мають серійний характер і тому не використовуватимуть декілька ядер. Однак багато завдань є надзвичайно паралельними:

  • Запустіть ту саму програму на багатьох файлах
  • Запустіть одну і ту ж програму для кожного рядка у файлі
  • Запустіть одну і ту ж програму для кожного блоку у файлі

GNU Parallel є загальним паралелізатором і дозволяє легко виконувати завдання паралельно на одній машині або на декількох машинах, до яких ви маєте доступ ssh.

Якщо у вас є 32 різні завдання, які ви хочете запустити на 4 процесорах, прямим способом паралелізації є виконання 8 завдань на кожному процесорі:

Просте планування

GNU Parallel натомість породжує новий процес, коли закінчується - підтримуючи активні процесори та заощаджуючи час:

GNU Паралельне планування

Установка

Особиста установка не вимагає доступу до кореня. Це можна зробити за 10 секунд, зробивши це:

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

Інші параметри встановлення див. На http://git.savannah.gnu.org/cgit/parallel.git/tree/README

Вивчайте більше

Дивіться більше прикладів: http://www.gnu.org/software/parallel/man.html

Перегляньте вступні відео: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

Пройдіться по підручнику: http://www.gnu.org/software/parallel/parallel_tutorial.html

Зареєструйтесь у списку електронних листів, щоб отримати підтримку: https://lists.gnu.org/mailman/listinfo/parallel


1
Я люблю паралель і намагаюся запропонувати його використання, де можу. Одне питання, хоч до вашого конкретного варіанту: чому ви вважали за краще запропонувати цю форму замістьparallel -N0 doit ::: {1..10}
Філіп -Зян К Лі- Стокманн

1
Значення {1..10}не працює в (t) csh / fish / ash, а {1..10}конструкція обмежена довжиною командного рядка, тому це не спрацює: {1..1000000000}тоді як seq 1000000000буде працювати чудово. Але для більшості ситуацій {1..10}буде працювати так, як очікувалося, і я часто це теж використовую.
Оле Танге

4

Ви можете використовувати forцикл у стилі C, який має перевагу перед версією розширення дужки ( {1..5}) у можливості використання змінних для визначення кінцевих точок. Будь-яка версія краще, ніж використання зовнішньої утиліти ( seq).

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

Усі в одному рядку:

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

Або ви можете зробити це без циклу (для цієї конкретної утиліти та функції):

xdotool click --repeat 5 --delay 50 1

0

Просто ви можете скористатися командою watch:

watch -n x <your command>

змінити х на час у секундах.

Приклад:

watch -n 1 xdotool click 1 

Отже xdotool click 1 повторюватиметься кожні 1 с, припиняйте його, коли закінчите.


4
Я думаю, що питання є специфічним для виконання команди певну кількість разів , а не стільки за визначений інтервал.
Яків Влійм
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.