Запустите программу X раз


18

Как мне выполнить программу X раз в терминале?

Я прочитал, что я должен сделать Tin bin / bash, но я не знаю, как выполнить это X раз.


что это, скрипт, приложение, что оно делает? что должно произойти в случае ошибок? это закрывается после того, как это бежало? это должно быть проверено, если это закрылось?
Джейкоб Влейм

это просто щелчок, щелчок xdotool Я не думаю, что это может создать ошибку.
user3597989

@KasiyA: Не совсем так, как все эти ответы зацикливаются навсегда. Здесь ОП запрашивает фиксированное количество циклов.
Сильвен Пино

4
Или Blufter's: askubuntu.com/a/508752/158442 - но оба они не принадлежат там, но здесь. : D
Муру

Ответы:


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

ошибка синтаксиса с 'do' ..
user3597989

@ user3597989 у меня работает, не могли бы вы еще раз проверить?
Сильвен Пино

@ user3597989 о, я знаю, пожалуйста, удалите первый $. Это просто там, чтобы указать приглашение оболочки, как sylvain@sylvain-ThinkPad-T430s:~$. Мы обычно добавляем его в ответы командной строки, чтобы отличить команду от ее результатов.
Сильвен Пино

@ user3597989: Я удалил подсказку оболочки, чтобы избежать путаницы
Сильвен Пино

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 Parallel, вы можете запустить:

seq 10 | parallel -N0 doit

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

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

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

Если у вас есть 32 различных задания, которые вы хотите запустить на 4 процессорах, прямой способ распараллеливания - запустить 8 заданий на каждом процессоре:

Простое планирование

GNU Parallel вместо этого порождает новый процесс после его завершения - поддерживая процессоры активными и, таким образом, экономя время:

Параллельное планирование GNU

Установка

Персональная установка не требует root-доступа. Это можно сделать за 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}Не работает (т) CSH / рыба / золы, а {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>

измените x на время в секундах.

Пример :

watch -n 1 xdotool click 1 

Таким образом, xdotool click 1 будет повторяться каждые 1 с, прекратите его, когда закончите.


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