Для интерактивного использования можно использовать alsamixer
. Для сценариев (например, привязка к сочетаниям клавиш) смотрят на amixer
.
alsamixer
включен по умолчанию в большинстве систем.
Установить использование общей громкости:
# Gets a list of simple mixer controls
$ amixer scontrols
Затем установите его на желаемый объем как пример
$ amixer sset 'Master' 50%
Если Вы хотите продолжительность в секундах при главном использовании
start=$SECONDS
и в конце
duration=$(( SECONDS - start ))
Вы могли использовать встроенный Linux time
команда. Из страницы справочника:
КОМАНДА времени [аргументы]
время определяет который информация отобразиться о ресурсах, используемых КОМАНДОЙ от формата строки. Если никакой формат не указан на командной строке, но переменная среды ВРЕМЕНИ установлена, ее значение используется в качестве формата.
Ко времени cleanup.sh
сценарий, используйте:
$ time cleanup.sh
Я понимаю, что это довольно старый вопрос, но я делаю это так, когда мне нужно/нужно знать, сколько времени потребовалось для выполнения чего-либо.
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
#!/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}'
@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
и деления является преобразование истекших секунд в соответствующие единицы часов, минут, секунд, соответственно.
Недавно я пытался сделать что-то подобное. Я бы предложил:
date1=$(date +%s)
#Use this arithmetic to determine elapsed time since defining date1
$(( $(date +%s) - $date1 ))
#While loop using timer
while ! [ $(( $(date +%s) - $date1 )) -gt 10 ]; do
#Terminal timer -n won't append new line, so the echo will replace itself.
##There is also some date formatting to achieve: HH:MM:SS.
echo -ne "$(date -u --date @$(( $(date +%s) - $date1 )) +%H:%M:%S)\r"
done