Я хочу сохранить результат $SECONDS
команда в переменную, для печати времени в формате HH:MM:SS
.
Это - то, что я попробовал до сих пор. Я пытался распечатать его по-разному и всегда получал результат как 0
:
time_spent="$SECONDS"
echo "Time: $time_spent"
Я хочу распечатать время, проведенное в оболочке, когда я закрываю свою консоль. Я создал сценарий, который работает каждый раз, когда консоль была закрыта.
Добираться $SECONDS
в формат HH:MM:SS необходимо будет сделать некоторую (целочисленную) математику:
hrs=$(( SECONDS/3600 )); mins=$(( (SECONDS-hrs*3600)/60)); secs=$(( SECONDS-hrs*3600-mins*60 ))
printf 'Time spent: %02d:%02d:%02d\n' $hrs $mins $secs
Time spent: 431:48:03
Вы сослались bash
внутренняя переменная SECONDS
(который производит число секунд, истекших, так как текущий экземпляр оболочки вызывается), и сохранил значение как другую переменную time_spent
. Теперь, после того каждого раза Вы проверяете значение переменной time_spent
, Вы получили бы то же значение - сохраненное, во время расширения SECONDS
.
Динамично добираться SECONDS
, необходимо сослаться $SECONDS
непосредственно вместо того, чтобы использовать промежуточную переменную:
echo "Time: $SECONDS"
Если Вы настаиваете на том, чтобы использовать промежуточную переменную, удостоверьтесь, что сделали расширение $SECONDS
каждый раз.
Относительно значения SECONDS
быть 0
, можно легко воспроизвести это:
% bash -c 'echo $SECONDS'
0
Точка: при вычислении значения это еще не секунда, таким образом, значение 0
, правильно.
Вот быстрый, который дает минуты часов и секунды, с тех пор как оболочка была открыта:
~$ cat how_long_open
#!/bin/bash
time=$SECONDS
printf '%dh:%dm:%ds\n' $(($time/3600)) $(($time%3600/60)) $(($time%60))
Начиная со скриптов, запущенных в подоболочке, лучший способ, который будет произведен, состоит в том, чтобы получить сценарий вместо того, чтобы назвать его.
Примеры:
Не получая сценарий
~$ ./how_long_open
0h:0m:0s
С определением источника сценария
~$ source ./how_long_open
1h:24m:40s
Надеюсь, это поможет!
Если Вы уверены это $SECONDS
будет меньше чем 1 день (т.е. 86 400 секунд), затем ядро-utils GNU date
делает довольно хорошее задание необходимого форматирования:
$ date -ud "@$SECONDS" "+Time elapsed: %H:%M:%S"
Time elapsed: 00:32:05
$