Як користуватися таймером в баші?


30

Мені потрібен був таймер, який запуститься на самому початку сценарію і зупиниться в кінці.


2
будь ласка, напишіть мету, яку ви хочете досягти. вимірювати timeкоманду використання робочого часу скрипта (time ./script.sh), роздрукувати dateкоманду використання поточного часу тощо.
пік


Використовуйте базовий linux cmd:, time yourprogram.shщо @Marius Cotofana пояснив
Martijn van Wezel

Відповіді:



23

Ви можете використовувати вбудовану timeкоманду Linux . На чоловіковій сторінці:

час COMMAND [аргументи]

час визначає, яку інформацію відображати про ресурси, які використовує КОМАНДА, з рядка FORMAT. Якщо в командному рядку не вказаний формат, але встановлена ​​змінна середовища TIME, його значення використовується як формат.

Щоб вчасно cleanup.shскрипт використати:

$ time cleanup.sh

1
Знайте, що timeви використовуєте. hackernoon.com/…
km6zla

8

Я усвідомлюю, що це досить старе питання, але це те, як я це роблю для будь-чого, коли хочу / потрібно знати, як довго щось потрібно пробігти.

Bash має вбудований таймер секунд у вигляді внутрішньої змінної з ім'ям SECONDS(див: тут для інших внутрішніх змінних)

Поставте SECONDS=0перед тим, що ви перевіряєте час виконання. Це потрібно робити після будь-якого введення користувача, щоб отримати хороший результат, тому якщо ви запитуєте про інформацію, введіть її після підказок.

Потім поставте це в кінці того, що ви перевіряєте:

if (( $SECONDS > 3600 )) ; then
    let "hours=SECONDS/3600"
    let "minutes=(SECONDS%3600)/60"
    let "seconds=(SECONDS%3600)%60"
    echo "Completed in $hours hour(s), $minutes minute(s) and $seconds second(s)" 
elif (( $SECONDS > 60 )) ; then
    let "minutes=(SECONDS%3600)/60"
    let "seconds=(SECONDS%3600)%60"
    echo "Completed in $minutes minute(s) and $seconds second(s)"
else
    echo "Completed in $SECONDS seconds"
fi

Якщо ви хочете знати час лише в секундах, ви можете спростити вищезгадане:

echo "Completed in $SECONDS seconds"

Як приклад:

read -rp "What's your name? " "name"
SECONDS=0
echo "Hello, $name"
if (( $SECONDS > 3600 )) ; then
    let "hours=SECONDS/3600"
    let "minutes=(SECONDS%3600)/60"
    let "seconds=(SECONDS%3600)%60"
    echo "Completed in $hours hour(s), $minutes minute(s) and $seconds second(s)" 
elif (( $SECONDS > 60 )) ; then
    let "minutes=(SECONDS%3600)/60"
    let "seconds=(SECONDS%3600)%60"
    echo "Completed in $minutes minute(s) and $seconds second(s)"
else
    echo "Completed in $SECONDS seconds"
fi

3
Ярлик для тих, хто не хоче такого складного форматування часу: date +%T -d "1/1 + $SECONDS sec"(обмежено менш ніж на 24 години, але ви можете також адаптуватися, щоб додати дні)
xhienne

1
#!/bin/bash

start=$(date +%s)
#
# do something
sleep 10
#
#
end=$(date +%s)

seconds=$(echo "$end - $start" | bc)
echo $seconds' sec'

echo 'Formatted:'
awk -v t=$seconds 'BEGIN{t=int(t*1000); printf "%d:%02d:%02d\n", t/3600000, t/60000%60, t/1000%60}'

1
Привіт, ласкаво просимо на Unix SE! Відповіді, що стосуються лише коду, виглядають не дуже добре, можливо, ви могли б пояснити, що робить ваш сценарій.
Peterh каже відновити Моніку

0

@anask зробіть розумне рішення для цієї відповіді, просто рекомендую $SECONDSзамість цього створити нове, щоб створити нове

awk -v t=$SECONDS 'BEGIN{t=int(t*1000); printf "Elapsed Time (HH:MM:SS): %d:%02d:%02d\n", t/3600000, t/60000%60, t/1000%60}'

Мета printfі поділ полягає в перетворенні минулих секунд на відповідні єдності Години, Мін, Секи відповідно.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.