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

706

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

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

codeforester
источник

Ответы:

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

RydallCooper
источник
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"
Vonton
источник
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
pcmaster574
источник
5
Просто наткнулся на это, потому что ответ с наибольшим количеством голосов, @RyndallCooper, сумасшедший почти год назад, набрал -59x столько же баллов и ушел намного глубже, и этот вопрос все еще появляется над ним, просто будучи более свежим.
Аидо
2
@AidanEdwards Это был лучший ответ и для меня, пока я не отсортировал по «голосам» (что по умолчанию - интересно, как оно было установлено на «активный»?). Установка его на «голосов» исправила это все же. Weird.
Кристианбунди
1
@stackoverflow - вы, ребята, должны изменить то, как это работает ... всегда держите голосование первым!
Деян
3
«это потому, что получивший наибольшее количество голосов ответ ... все еще появляется над ним просто потому, что он более свежий» - нет, нет, НИКОГДА не следует голосовать за ответ по таким легкомысленным причинам, не связанным с плохим содержанием в этом ответе.
Николас Петерсен
35

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

sleep 120
AnneTheAgile
источник
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для отладки командной строки

Ахиль Дж
источник