Как использовать $ SECONDS внутри сценария bash?

У вас может возникнуть ошибка, связанная с v-синхронизацией. Если вы используете единство, попробуйте установить ccsm и поиграть с опцией v-sync в настройках opengl.

4
задан 28 April 2018 в 18:20

12 ответов

Чтобы получить $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
7
ответ дан 22 May 2018 в 11:12
  • 1
    Я думаю, что лучше сохранить $SECONDS как переменную во-первых - сохранить согласованность (не уверен, сколько доли секунды осталось для выполнения двух последних вычислений). – heemayl 27 April 2018 в 22:30

Чтобы получить $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
7
ответ дан 17 July 2018 в 16:00

Чтобы получить $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
7
ответ дан 23 July 2018 в 16:55

Вы указали внутреннюю переменную bash SECONDS (которая выводит количество секунд, прошедших с момента вызова текущего экземпляра оболочки) и сохранила значение в качестве другой переменной time_spent. Теперь, после этого каждый раз, когда вы проверяете значение переменной time_spent, вы получите то же значение - сохраненное в момент расширения SECONDS.

Чтобы динамически получить , вы должны ссылаться на $SECONDS напрямую, а не на использование промежуточной переменной:

echo "Time: $SECONDS"

Если вы настаиваете на использовании промежуточной переменной, обязательно выполняйте расширение $SECONDS каждый раз. 2]

Что касается значения SECONDS, являющегося 0, вы можете легко воспроизвести это:

% bash -c 'echo $SECONDS'
0

Точка: когда вы вычисляете значение, это еще не секунда, поэтому значение будет 0, правильно.

5
ответ дан 22 May 2018 в 11:12
  • 1
    это весь скрипт, я думаю, что это потому, что я запускаю сценарий оболочки, и в данный момент значение переменной SECONDS равно 0. Чего может быть решением для такого рода работ. Мне нужно потратить время на вывод оболочки, когда я закрываю консоль, поэтому я создал сценарий оболочки, который запускается каждый раз, когда я закрываю консоль – Andrew 27 April 2018 в 22:22
  • 2
    @Andrew Проверьте мои изменения. – heemayl 27 April 2018 в 22:23

Вот быстрый, который дает часы минут и секунд с момента открытия оболочки:

~$ 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

Без поиска сценария

[ f3]

Надеюсь, это поможет!

4
ответ дан 22 May 2018 в 11:12

Если вы уверены, что $SECONDS будет меньше 1 дня (т. е. 86400 секунд), то GNU core-utils date выполняет довольно хорошую работу с необходимым форматированием:

$ date -ud "@$SECONDS" "+Time elapsed: %H:%M:%S"
Time elapsed: 00:32:05
$
4
ответ дан 22 May 2018 в 11:12

Если вы уверены, что $SECONDS будет меньше 1 дня (т. е. 86400 секунд), то GNU core-utils date выполняет довольно хорошую работу с необходимым форматированием:

$ date -ud "@$SECONDS" "+Time elapsed: %H:%M:%S" Time elapsed: 00:32:05 $
4
ответ дан 17 July 2018 в 16:00

Вы указали внутреннюю переменную bash SECONDS (которая выводит количество секунд, прошедших с момента вызова текущего экземпляра оболочки) и сохранила значение в качестве другой переменной time_spent. Теперь, после этого каждый раз, когда вы проверяете значение переменной time_spent, вы получите то же значение - сохраненное в момент расширения SECONDS.

Чтобы динамически получить SECONDS, вы должны ссылаться на $SECONDS напрямую, а не на использование промежуточной переменной:

echo "Time: $SECONDS"

Если вы настаиваете на использовании промежуточной переменной, обязательно выполняйте расширение $SECONDS каждый раз.

Что касается значения SECONDS, являющегося 0, вы можете легко воспроизвести это:

% bash -c 'echo $SECONDS' 0

Точка: когда вы вычисляете значение, это еще не секунда, поэтому значение будет 0, правильно.

5
ответ дан 17 July 2018 в 16:00

Вот быстрый, который дает часы минут и секунд с момента открытия оболочки:

~$ 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

Надеюсь, это поможет!

4
ответ дан 17 July 2018 в 16:00

Если вы уверены, что $SECONDS будет меньше 1 дня (т. е. 86400 секунд), то GNU core-utils date выполняет довольно хорошую работу с необходимым форматированием:

$ date -ud "@$SECONDS" "+Time elapsed: %H:%M:%S" Time elapsed: 00:32:05 $
4
ответ дан 23 July 2018 в 16:55

Вы указали внутреннюю переменную bash SECONDS (которая выводит количество секунд, прошедших с момента вызова текущего экземпляра оболочки) и сохранила значение в качестве другой переменной time_spent. Теперь, после этого каждый раз, когда вы проверяете значение переменной time_spent, вы получите то же значение - сохраненное в момент расширения SECONDS.

Чтобы динамически получить SECONDS, вы должны ссылаться на $SECONDS напрямую, а не на использование промежуточной переменной:

echo "Time: $SECONDS"

Если вы настаиваете на использовании промежуточной переменной, обязательно выполняйте расширение $SECONDS каждый раз.

Что касается значения SECONDS, являющегося 0, вы можете легко воспроизвести это:

% bash -c 'echo $SECONDS' 0

Точка: когда вы вычисляете значение, это еще не секунда, поэтому значение будет 0, правильно.

5
ответ дан 23 July 2018 в 16:55
  • 1
    это весь скрипт, я думаю, что это потому, что я запускаю сценарий оболочки, и в данный момент значение переменной SECONDS равно 0. Чего может быть решением для такого рода работ. Мне нужно потратить время на вывод оболочки, когда я закрываю консоль, поэтому я создал сценарий оболочки, который запускается каждый раз, когда я закрываю консоль – Andrew 27 April 2018 в 22:22
  • 2
    @Andrew Проверьте мои изменения. – heemayl 27 April 2018 в 22:23

Вот быстрый, который дает часы минут и секунд с момента открытия оболочки:

~$ 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

Надеюсь, это поможет!

4
ответ дан 23 July 2018 в 16:55

Другие вопросы по тегам:

Похожие вопросы: