На моей машине мне нужно выполнить цикл, который повторяет одну простую команду, которая должна иметь задержку, выраженную в долях секунды.
Допустим, мне нужно:
- чтобы сохранить файл с возрастающим перечислением (файл-0, файл-1, файл-2, ...), сгенерированный чем-то тривиальным для этого примера, например
time > file-$x
- Мне нужно делать это каждые 1/70 секунды (как пример), потому что я хотел бы выразить свое время с долями секунды.
Как я могу быть по-настоящему точным и выразить все с помощью bash-скрипта?
Фракция может генерировать неопределенное количество, мне нужно быть точным, и поэтому мне нужно по крайней мере 4-5 десятичных знаков.
Может быть, вы можете просто запустить
?
в моем
archlinux
дистрибутиве:источник
sleep
разрешает дроби? Можете ли вы предложить полный пример с поддельной петлей?Создание процесса и загрузка в него нового исполняемого файла, вероятно, займет несколько миллисекунд, поэтому такая точность не имеет смысла. Также обратите внимание, что процессорное время во многих системах распределяется между процессами срезами до 10 мс.
Тем не менее, некоторые
sleep
реализации занимают дробные числа секунд, и zsh и ksh93 могут сделать свою$SECONDS
специальную переменную дробной сtypeset -F SECONDS
.Пример (zsh):
Ой, это дрейфовало. Вы можете настроить время сна на основе
$SECONDS
:Эти 2 дополнительные миллисекунды, вероятно, должны быть учтены при запуске команды last
sleep
иdate
.Также обратите внимание, что у zsh есть
zselect
встроенная функция с таймаутом, выраженным в сотых долях секунды. И ksh93 имеетsleep
встроенные (и принимает с плавающей запятой) иprintf
может печатать дату / время.Если вы хотите что-то более точное, вы, вероятно, захотите операционную систему реального времени или операционную систему с возможностями реального времени и, конечно, не использовать оболочку.
источник
sleep 1/70
не разрешено на моей машине ...Если ваша оболочка
sleep
не принимает дробь, используйте perl.Если вам нужно выяснить дробь, используйте
echo "scale=5; 1/70" | bc
источник
Под Alpine Linux (Busybox) вы можете зацикливаться на микросекунды с
usleep 10
(эквивалентно0.00001
секунде)GNU sleep
поддерживает доли секунды:sleep 0.00001
источник