Я пытаюсь найти простой способ повторного выполнения команды всякий раз, когда она завершается, по любой причине (ошибка или нет).
Каков наилучший способ приблизиться к этому?
РЕДАКТИРОВАТЬ: Я не был достаточно ясным, прежде чем. Мне нужно следующее выполнение, чтобы дождаться окончания предыдущего.
РЕДАКТИРОВАТЬ 2: почти все ответы работают отлично. Я ошибочно полагал, что большинство ответов либо разорвет процесс, либо повторно выполнит его только один раз, ни один из которых не требуется.
Ответы:
Это создает бесконечный цикл, выполняемый
command
снова и снова.источник
while true; do echo 'Hit CTRL+C'; sleep 1; done
спасибо cyberciti.biz/faq/bash-infinite-loopКоманда
watch
будет повторять команду всегда с указанным интервалом:Установка
-n
на ноль эффективно ставит интервал в ничто (я думаю, что это действительно .1 секунды).watch
также имеет дополнительные преимущества выравнивания выходных данных, так что визуальные изменения могут быть легко видны, и имеет переключатель, чтобы выделить изменения с последнего запуска.Ссылка: страница руководства часов :
источник
watch ls
в каталоге, содержащем файлы, вы ничего не получаете?Простое решение будет:
;
разделяет команды, позволяя использовать несколько команд в одной строке ( Bash: Lists )!#
говорит bash «повторить все, что я написал до сих пор в этой строке» ( Bash: Event-Designators )источник
yourcommand; !!
что фактически не работает с командами в одной строке, однако,!#
похоже, работает. Ура!; !#
не работал на ZSH, он просто расширяет утверждение, по сути клонируя его, он не вызывает егоВы можете планировать заранее во время выполнения команды (при условии, что она не является интерактивной) и ввести,
!!
которая снова выполнит предыдущую команду. Это работает, например, во времяping -c 5
.Вы также можете определить функцию в
bash
:Чтобы сохранить это, сохраните это в
~/.bashrc
.Затем вы можете запустить свою команду следующим образом:
Если это определенная команда, которую вы хотите выполнить многократно (а не, например, какая-либо команда), вы можете заменить
"$@"
в этом фрагменте вашу фактическую команду и назвать функцию, например,repeat_ping
вместо этого.Чтобы сделать его бесконечным циклом, вы можете делать то, что предлагает @Dennis. Я рекомендую вам добавить период ожидания, если вы собираетесь использовать это в интерактивной оболочке, например:
В противном случае довольно неудобно прерывать использование этого бесконечного цикла
Ctrl-Z
.источник
Дайте
while
циклу логическое условие, такое как:Это будет выполняться снова и снова, пока bash не получит сигнал о завершении процесса. Обычно в форме
ctrl+c
.Вы также можете использовать
watch
команду для многократного запуска скрипта. Например, простые часы в вашем терминале bashwatch
могут выглядеть так:-t
Опция указывает ,watch
чтобы не отображать название процесса он работает. Это дает вам чистый вывод только повторяемой команды.-n1
Опция говорит смотреть повторять каждыеn
секунды. В этом случае-n1
будут интервалы1
секунды. Затемdate +%T
команда показывает время во время выполнения команды. Выполнение этой команды даст вам активные часы в вашем терминале.И тогда еще один метод, которого нет ни в одном из других ответов, - это бесконечный вызов функции.
По сути, это то же самое, что и логический
while
цикл, использующий только рекурсивные вызовы функций.(edit) Для того, чтобы помнить о ресурсах вашей машины, я добавил
&& wait
так, что при каждом запуске процесса циклы будут «ждать», пока этот процесс не завершится со статусом выхода 0 до следующей итерации. Это полезно в интерактивном скрипте оболочки.источник
while
пример цикла, но он не использует логическийtrue
синтаксис. Естьwatch
пример, но он не дает много полезного синтаксиса. Я излагаю их, кому бы это ни помогло. Я хотел дать некоторую практическую полезность этим.while
Логический цикл также может бытьfalse
и не выполнять , пока не соответствует действительности условие не будет выполнено. Это довольно удобно.if
продолжать повторное выполнение?if
выражении.Это еще один метод, который я использую, чтобы повторить команду в bash. Для некоторых это может показаться глупым, поскольку не требует написания сценария и может быть известно многим. Но я думаю, что стоит упомянуть, так как он быстрый и удобный для начинающих, в том смысле, что синтаксис запоминать не так много. Я проверял это только в gnome-терминале Ubuntu, и другие терминалы могут не поддерживать это.
Вам не нужно ждать вставки, пока не завершится каждая команда. Вставленные команды попадают в очередь и выполняются одна за другой.
источник
Я чувствую себя дерзким сегодня.
Прочитайте один из бесконечных потоков и отправьте
xargs
Если вам нужно сделать небольшой перерыв, вам, скорее всего, придется выполнить
sh
источник