Как я могу приостановить свой сценарий оболочки на секунду, прежде чем продолжить?


706

Я только нашел, как ждать ввода пользователя. Однако я только хочу сделать паузу, чтобы while trueмой компьютер не зависал.

Я пытался pause(1), но это говорит -bash: syntax error near unexpected token '1'. Как это можно сделать?

Ответы:


1235

Используйте sleepкоманду.

Пример:

sleep .5 # Waits 0.5 second.
sleep 5  # Waits 5 seconds.
sleep 5s # Waits 5 seconds.
sleep 5m # Waits 5 minutes.
sleep 5h # Waits 5 hours.
sleep 5d # Waits 5 days.

Можно также использовать десятичные дроби при указании единицы времени; напримерsleep 1.5s


12
Я всегда забываю это sleep! ( pause, waitили delayимело бы больше смысла и было бы легче запомнить.)
Джеремия

47
Похоже, на Mac OS X s, m, h и d не имеют никакого влияния. Вы должны указать время в секундах.
Архитектор AI

6
Я думаю, что присвоение имен происходит потому, что у нас есть thread.sleepфункции на многих языках программирования @Geremia
Amin_mmz

89

И что насчет:

read -p "Press enter to continue"

35
На самом деле, это ответило на мой вопрос, даже если оно не отвечает на ОП.
Джесси Чисхолм

9
это не имеет ничего общего с этим постом.
Муртадха С.

7
@murtadhaalsabbagh, но имеет очень много общего с индексацией Google :) Помогло и мне, кстати.
Юлиан

прочитайте -p «Нажмите Enter, чтобы продолжить» -t 1 следует сделать паузу на 1 секунду
СЗБ

@JesseChisholm Я думаю, что люди ищут bash-эквивалент powershell / cmdPAUSE
rovyko

67

В Python (вопрос был изначально помечен как Python) необходимо импортировать модуль времени

import time
time.sleep(1)

или

from time import sleep
sleep(1)

Для сценария оболочки это просто

sleep 1

Который выполняет sleepкоманду. например./bin/sleep


5
да, это говорит об этом, просто другой был первым, и у него есть хороший пример :) но +1!

3
Так что, хотя это неправильный способ сделать это, вы можете объединить ответ python с Bash, используя python -c "import time; time.sleep(1)"вместо sleep 1:)
Berry M.

2
@BerryM. - Занимает около 1,2 секунд, когда я пытаюсь это сделать. Python запускается не сразу - вам нужно это учитывать. Сделай это python -c "import time; time.sleep(0.8)"вместо этого. Но тогда нам нужно учитывать, сколько времени на самом деле занимает запуск python. Вам нужно запустить это: date +%N; python -c "import time; time.sleep(0)"; date +%Nчтобы определить, сколько наносекунд требуется Python для запуска. Но это также включает в себя некоторые накладные расходы от даты запуска. Запустите это, date +%N; date +%Nчтобы найти это накладные расходы. Накладные расходы Python на моей машине были на самом деле ближе к 0,14 секундам. Так я хочу time.sleep(0.86).
ArtOfWarfare

Правда, хотя вы никогда не получите ровно 1000 мс, даже не так.
Берри М.

Как правило, спецификация - это, по крайней мере, определенное количество времени, которое обычно соответствует цели сна.
Марлин Пирс,

40

Я понимаю, что немного опаздываю с этим, но вы также можете вызвать сон и передать время ожидания. Например, если я хотел подождать 3 секунды, я могу сделать:

/bin/sleep 3

4 секунды будут выглядеть так:

/bin/sleep 4

5
Просто наткнулся на это, потому что ответ с наибольшим количеством голосов, @RyndallCooper, сумасшедший почти год назад, набрал -59x столько же баллов и ушел намного глубже, и этот вопрос все еще появляется над ним, просто будучи более свежим.
Аидо

2
@AidanEdwards Это был лучший ответ и для меня, пока я не отсортировал по «голосам» (что по умолчанию - интересно, как оно было установлено на «активный»?). Установка его на «голосов» исправила это все же. Weird.
Кристианбунди

1
@stackoverflow - вы, ребята, должны изменить то, как это работает ... всегда держите голосование первым!
Деян

3
«это потому, что получивший наибольшее количество голосов ответ ... все еще появляется над ним просто потому, что он более свежий» - нет, нет, НИКОГДА не следует голосовать за ответ по таким легкомысленным причинам, не связанным с плохим содержанием в этом ответе.
Николас Петерсен

35

На Mac OSX, сон не занимает минут / и т.д., только секунды. Итак, на две минуты,

sleep 120

27

Выполнить несколько снов и команд

sleep 5 && cd /var/www/html && git pull && sleep 3 && cd ..

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


4
+1 ... потому что если вы используете один амперсанд после сна, он отправляет сон в свой собственный поток, а затем сразу же начинает следующее действие (т.е. сон не задерживает следующее действие)
Jay Marm

18

В сценарии вы можете добавить следующее между действиями, которые вы хотите сделать паузу. Это приостановит процедуру на 5 секунд.

read -p "Pause Time 5 seconds" -t 5
read -p "Continuing in 5 Seconds...." -t 5
echo "Continuing ...."

Это на самом деле не будет работать, не так ли? Я думаю, что -t 5сценарий будет прерван через 5 секунд, а не продолжен, по крайней мере, в соответствии с этой страницей
Брэд Паркс

@BradParks Да, это будет работать На всякий случай: root @ Joses-iPad: ~ # cat readtest.bash #! / Bin / bash echo "Здесь" read -p "Время паузы 5 секунд" -t 5 read -p "Продолжение в 5 секунд .... "-t 5 эхо" Продолжение .... "эхо" Там "root @ Joses-iPad: ~ # cat re./st.bash Здесь Время паузы 5 секунд Продолжение в 5 секунд .... Продолжение .... Там
Хосе Х. Роза

Хммм .... я думаю ты прав! Я думал, что попробовал это, но я только попробовал это снова, и это работает как рекламируется. Спасибо!
Брэд Паркс

5

read -r -p "Wait 5 seconds or press any key to continue immediately" -t 5 -n 1 -s

Чтобы продолжить, когда вы нажимаете любую кнопку


7
Хотя этот фрагмент кода может быть решением, включение пояснения действительно помогает улучшить качество вашего сообщения. Помните, что вы отвечаете на вопрос читателей в будущем, и эти люди могут не знать причин, по которым вы предлагаете код.
мирный

1
Этот ответ является комментарием только для кода. Он не пытается объяснить данный код. Я чувствую, что постер неверно истолковал вопрос как «Как мне ждать ввода пользователя, одновременно имея тайм-аут на этом вводе»
Zimano

2

Вы можете заставить его ждать, используя $ RANDOM, генератор случайных чисел по умолчанию. Ниже я использую 240 секунд. Надеюсь, это поможет @

> WAIT_FOR_SECONDS=`/usr/bin/expr $RANDOM % 240` /bin/sleep
> $WAIT_FOR_SECONDS

1

используйте trap для приостановки и проверки командной строки перед запуском

trap 'tput setaf 1;tput bold;echo $BASH_COMMAND;read;tput init' DEBUG

нажмите любую клавишу чтобы продолжить

использовать с set -xдля отладки командной строки

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