Хакерский подход с использованиемpv
:
$ yes | pv -SeL1 -s 5 > /dev/null
ETA 0:00:04
Или:
$ yes | pv -SL1 -F 'Resuming in %e' -s 5 > /dev/null
Resuming in ETA 0:00:04
pv
обычно используется для отображения индикатора выполнения ввода-вывода некоторого потока данных. Здесь мы используем постоянный поток команды yes
, но скорость -ограничивает его до 1 байта в секунду(-L1
)и S
достигает предела после того, как вывод достигает s
размера 5
. байт.
Вы можете добавить туда больше информации, например, прошедшее время, расчетное время прибытия, как в часах, когда ожидается его завершение, или даже индикатор выполнения:
$ yes | pv -SpeL1 -s 5 > /dev/null
[===========> ] 20% ETA 0:00:04
Обратите внимание, что продолжительность не будет ровно 5 секунд (ближе к 6 на самом деле здесь с pv 1.6.6 в моих тестах ).
Говоря о индикаторе выполнения ,вы также можете передать его вывод наzenity
(графический )или diaglog
/ whiptail
для еще более красивого отображения:
yes | pv -SnL1 -s 5 2>&1 > /dev/null |
zenity --progress --auto-close --no-cancel \
--title 'Please wait...' --text 'Please wait...'
yes | pv -SnL1 -s 5 2>&1 > /dev/null |
whiptail --gauge 'Please wait...' 5 20 0
Для более плавного продвижения вы можете увеличить скорость до 10 байт в секунду (и умножить отрезанный -размер на 10 ), указав при этом, что вы получите 10 обновлений в секунду:
yes | pv -SpeL10 -i0.1 -s 50 > /dev/null
yes | pv -SnL10 -i 0.1 -s 50 2>&1 > /dev/null |
whiptail --gauge 'Please wait...' 6 20 0
Запустить режим сна 5 раз?
for ((i=5;i>0;i--)); do printf '%s %s\r' "$i" 'seconds pending'; sleep 1; done; echo
Точность довольно хорошая, есть только накладные расходы цикла.