55

Я пытаюсь найти простой способ повторного выполнения команды всякий раз, когда она завершается, по любой причине (ошибка или нет).

Как лучше всего подойти к этому?

РЕДАКТИРОВАТЬ: Я не был достаточно ясным, прежде чем. Мне нужно следующее выполнение, чтобы дождаться окончания предыдущего.

РЕДАКТИРОВАТЬ 2: почти все ответы работают отлично. Я ошибочно полагал, что большинство ответов либо разорвет процесс, либо повторно выполнит его только один раз, ни один из которых не требуется.

6 ответов6

100

Команда watch будет повторять команду всегда с указанным интервалом:

watch -n0 <command>

Установка -n в ноль фактически устанавливает интервал в ничто (я думаю, что это действительно .1 секунды).

watch также имеют дополнительные преимущества выравнивания выходных данных, так что визуальные изменения могут быть легко видны, и имеют переключатель, чтобы выделить изменения с последнего запуска.

Ссылка: страница руководства часов:

Команда watch запускает команду несколько раз, отображая ее результат (первый экран). Это позволяет вам наблюдать за изменением выходных данных программы с течением времени. По умолчанию программа запускается каждые 2 секунды; используйте -n или --interval, чтобы указать другой интервал.

часы будут работать до тех пор, пока не прервутся.

34

Это создает бесконечный цикл, выполняющий command снова и снова.

while :
    do
        command
done
16

Простое решение будет:

yourcommand; !#

; разделяет команды, позволяя использовать несколько команд в одной строке (Bash: Lists)

!# говорит bash «повторить все, что я написал до сих пор в этой строке» (Bash: Event-Designators)

7

Вы можете планировать заранее во время выполнения команды (при условии, что она не является интерактивной) и ввести !! который выполнит предыдущую команду снова. Это работает, например, во время ping -c 5 .


Вы также можете определить функцию в bash:

function repeat { "$@"; "$@"; }

Чтобы сохранить его, сохраните его в ~/.bashrc .

Затем вы можете запустить свою команду следующим образом:

repeat ping -c5 heise.de

Если это определенная команда, которую вы хотите выполнить многократно (а не, например, какая-либо команда), вы можете заменить "$@" в этом фрагменте на вашу фактическую команду и назвать функцию, например, repeat_ping .


Чтобы сделать его бесконечным циклом, вы можете делать то, что предлагает @Dennis. Я рекомендую вам добавить период ожидания, если вы собираетесь использовать это в интерактивной оболочке, например:

function repeat { while 1 ; do "$@" ; sleep 1 ; done; }

В противном случае довольно неудобно прерывать этот бесконечный цикл с помощью Ctrl-Z .

4

Дайте while цикла логическое условие , например следующим образом :

#!/bin/bash

while true; do

    do_something && wait

done

Это будет выполняться снова и снова, пока bash не получит сигнал о прекращении процесса. Обычно в виде ctrl+c .

Вы также можете использовать команду watch для многократного запуска скрипта. Например, простые часы в вашем bash-терминале с использованием watch могут выглядеть так:

$ watch -t -n1 date +%T

Опция -t указывает watch не отображать название процесса, который он запускает. Это дает чистый вывод только повторяющейся команды. Опция -n1 часы повторяться каждые n секунд. В этом случае -n1 будет интервалом в 1 секунду. Затем команда date +%T показывает время на момент завершения команды. Выполнение этой команды даст вам активные часы в вашем терминале.

И тогда еще один метод, которого нет ни в одном из других ответов, - это бесконечный вызов функции.

do_something() { do_something }; do_something && wait

Это, по существу такой же , как логическое значение во while цикла только с помощью рекурсивных вызовов функций.

(edit) Для того, чтобы помнить о ресурсах вашей машины, я добавил && wait чтобы при каждом запуске процесса циклы "ожидали", пока этот процесс не завершится со статусом выхода 0 до следующей итерации. Это полезно в интерактивном сценарии оболочки.

0

Это еще один метод, который я использую, чтобы повторить команду в bash. Для некоторых это может показаться глупым, поскольку не требует написания сценария и может быть известно многим. Но я думаю, что стоит упомянуть, потому что это быстро и удобно для новичков, в том смысле, что синтаксис запоминается немного. Я проверял это только в gnome-терминале Ubuntu, и другие терминалы могут не поддерживать это.

  1. Введите команду в терминале один раз.
  2. Выберите команду, включая символ новой строки, с помощью мыши.
  3. Скопируйте выделение с помощью Ctrl-Insert или с помощью контекстного меню (обычно доступ с помощью правой кнопки мыши).
  4. Используйте Shift-Insert, чтобы вставить столько раз, сколько вы хотите выполнить команду.

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .