Команда sleep в Linux — одна из самых простых команд. Как видно из названия, его единственная функция — спать. Другими словами, он вводит задержку на указанное время.
Таким образом, если вы используете команду sleep с x, то следующая команда может быть запущена только через x секунд.
Кстати, бывает так, что в системе не предусмотрена или не установлена утилита sleep. Тогда ее можно заменить специальной функцией (см. далее).
Команда sleep имеет простой синтаксис:
sleep Number[Suffix]
Здесь суффикс может быть:
- s - по умолчанию, секунды
- m - минуты.
- h - час.
- d - день.
Давайте посмотрим несколько примеров команды sleep.
Примеры команды Sleep в Bash
Хотя вы можете использовать его непосредственно в оболочке, команда sleep обычно используется для введения задержки в выполнение сценария Bash. Мы собираемся показать использование команды sleep через примеры сценариев Bash.
Команда sleep без суффикса считается в секундах
Предположим, вы хотите приостановить ваш Bash-скрипт на 5 секунд, вы можете использовать режим sleep следующим образом:
sleep 5
В примере скрипта Bash это может выглядеть так:
!/bin/bash
echo "Sleeping for 5 seconds…"
sleep 5
echo "Completed"
Если вы запустите его с помощью команды time, вы увидите, что скрипт bash на самом деле работал (немного) более 5 секунд.
time ./sleep.sh
Sleeping for 5 seconds…
Completed
real 0m5.008s
user 0m0.000s
sys 0m0.007s
Команда Sleep с суффиксом m, h или d
Вы можете указать время sleep в минутах следующим образом:
sleep 1m
Это приостановит скрипт/оболочку на одну минуту. Если вы хотите отложить сценарий на несколько часов, вы можете сделать это с помощью суффикса h:
sleep 2h
Даже если вы хотите приостановить скрипт на несколько дней, вы можете сделать это с помощью суффикса d:
sleep 5d
Это может помочь, если вы хотите работать в разные дни или дни недели.
Команда sleep с комбинацией секунд, минут, часов и дня
Вы не обязаны использовать только один суффикс за раз. Вы можете использовать более одного суффикса, и продолжительность sleep является суммой всех суффиксов.
Например, если вы используете следующую команду:
sleep 1h 10m 5s
Это заставит скрипт ждать 1 час 10 минут и 5 секунд. Обратите внимание, что суффикс s здесь по-прежнему необязателен.
Бонусный совет: спать меньше секунды
Вы могли заметить, что наименьшая единица времени в команде sleep — секунда. Но что если ваш bash-скрипт будет спать в течение миллисекунд?
Хорошо, что вы можете использовать с плавающей точкой (десятичные точки) с командой sleep.
Поэтому, если вы хотите ввести паузу в 5 миллисекунд, используйте ее следующим образом:
sleep 0.005
Вы также можете использовать десятичные точки с другими суффиксами.
sleep 1.5h 7.5m
Будет введена задержка в 1 час 37 минут и 30 секунд.
Замена утилиты sleep
Если в системе отсутствует утилита sleep, то ее можно заменить следующей функцией, прописанной в том же bash-скрипте.
_sleep () { read -rt "$1"; }
Скрипт, использующий эту функцию, может выглядеть так:
#!/bin/bash
_sleep () { read -rt "$1" | : ; }
echo "Рас"
_sleep 5
echo "Два"
То есть, команда sleep X, по-сути, заменяется командой read -rt X | : ;
Здесь надо пояснить почему такой странный синтаксис. Дело в том, что команда read вернет ненуливой код ошибки при истечении времени. Это может повлиять на выполнение скрипта, если будет установлен выход при обнаружении ошибки через опцию set -e. Такую особенность надо учитывать. Поэтому команда read объединена через передачу потока | с пустой командой :. Эта пустая команда всегда возвращает нуливой код ошибки, и как бы "перебивает" ненуливой код ошибки read. И поэтому функция будет работать так же как и с sleep утилита, не генерируя ошибки.