Как вычесть время и выставочные секунды или миллисекунды?
begin_time=$(date)
echo $(date) - $begin_time
конечно, это не работает, как сделать это?
Bash имеет созданный в функции для названного time
. Просто предварительно ожидайте его к любой команде, и это будет время, сколько времени команда берет для выполнения. Для большего количества информации посмотрите help time
:)
[user@sol ~]$ time sleep 2
real 0m2.002s
user 0m0.002s
sys 0m0.000s
zsh имеет подобное встроенное, также названное time
, хотя никакая страница справки для help time
. Вот демонстрационный вывод:
[sol ~]$ time sleep 2
sleep 2 0.00s user 0.00s system 0% cpu 2.003 total
В дополнение к time
встроенный, там существует /usr/bin/time
, который часто более полезен.
walt@bat:~(0)$ /usr/bin/time sleep 2
0.00user 0.00system 0:02.04elapsed 0%CPU (0avgtext+0avgdata 1756maxresident)k
80inputs+0outputs (1major+73minor)pagefaults 0swaps
walt@bat:~(0)$ /usr/bin/time -v sleep 2
Command being timed: "sleep 2"
User time (seconds): 0.00
System time (seconds): 0.00
Percent of CPU this job got: 0%
Elapsed (wall clock) time (h:mm:ss or m:ss): 0:02.00
Average shared text size (kbytes): 0
Average unshared data size (kbytes): 0
Average stack size (kbytes): 0
Average total size (kbytes): 0
Maximum resident set size (kbytes): 1828
Average resident set size (kbytes): 0
Major (requiring I/O) page faults: 0
Minor (reclaiming a frame) page faults: 73
Voluntary context switches: 2
Involuntary context switches: 0
Swaps: 0
File system inputs: 0
File system outputs: 0
Socket messages sent: 0
Socket messages received: 0
Signals delivered: 0
Page size (bytes): 4096
Exit status: 0
walt@bat:~(0)$
Или, если Вы действительно хотите сделать это вручную, читать man date
и используйте date +%s.%N
(%s = секунды с Эпохи, %N = наносекунды)
Если Вы используете bash
или zsh
оболочке, и только нужно разрешение секунд, затем можно использовать их SECONDS
переменная оболочки. От man bash
:
SECONDS Each time this parameter is referenced, the number of seconds since shell invocation is returned. If a value is assigned to SECONDS, the value returned upon subsequent references is the number of seconds since the assignment plus the value assigned.
Так, при присвоении значения нуля прежде, чем выполнить команду (или последовательность команд), вычитание сделано для Вас.
Напр.
$ SECONDS=0 && sleep 2 && echo $SECONDS
2
Интересно, ksh93
имеет a SECONDS
таймер, но это, кажется, обеспечивает разрешение миллисекунды:
$ ksh
$ SECONDS=0 && sleep 2 && echo $SECONDS
2.002
(Оболочка Korn - который предшествует bash
и zsh
- в более общем плане может обработать арифметику оболочки нецелого числа.)
(принятие Вы используете Bash),
begin_time=$(date +%s) # Get seconds since Unix epoch.
sleep 2 # For example
echo $(($(date +%s) - begin_time)) seconds
Это должно произвести 2 seconds
.
(N.B. Обычно необходимо заключить все расширения в кавычки, но эти значения, как гарантируют, будут целыми числами.)
begin_time= date
variable=$(command)
. Путем Вы записали это, это будет звонить date
с begin_time
как переменная среды - нисколько, что Вы хотите.date
вывод является определенным для локали. Вот почему я использую время Unix вместо этого.echo date - $(begin_time)
$((expression))
.$(command)
$variable
или ${variable}
.