Гораздо проще измерить время в секундах, начиная с эпохи ( +% s
). Затем прошедшее время в секундах получается путем простого вычитания и преобразования из секунд в Минуту просто нужно разделить на 60:
export etool_start=$(date +"%s")
do_stuff_with_etool
export etool_stop=$(date +"%s")
echo "elapsed time=$(( (etool_stop - etool_start)/60 )) minutes"
Если вам действительно нужно время в человеческой форме, вы можете преобразовать их. Использование GNU date
:
$ date -d "@$etool_start"
Tue Jul 5 21:30:19 PDT 2016
Или:
$ date -d "@$etool_start" "+%Y%m%d%H%M"
201607052130
Чтобы выразить прошедшее время в минутах в различных форматах, мы можем использовать printf
. Например, чтобы получить истекшее время с четырьмя цифрами, мы можем использовать формат % 04i
:
$ printf '%04i\n' "$(( ($etool_stop - $etool_start)/60 ))"
0001
Формат % 4i
даст нам целое число (i) в четырех символы. Если нам нужны ведущие нули вместо ведущих пробелов, мы используем % 04i
.
Если нам нужен противоположный знак для числа:
$ printf '%05i\n' "$(( ($etool_start - $etool_stop)/60 ))"
-0035
Поскольку для знака минус требуется дополнительный символ, мы увеличили выделенное пространство с 4 до 5: % 05i
.
Поскольку в приведенном выше примере использовалась арифметика bash, которая является только целочисленной. Если вы хотите, чтобы истекшее время в минутах с долями минуты, можно использовать другой инструмент, например bc
:
$ echo "($etool_stop - $etool_start)/60" | bc -l
1.38333333333333333333
Из man date
], секунды с начала эпохи определяются следующим образом:
% s
секунд с 1970-01-01 00:00:00 UTC
Поскольку это определено таким образом, местный часовой пояс не имеет значения. Следовательно, вычисление его в "местном часовом поясе" или во всемирном времени, -u
, не имеет значения:
$ date +%s; date -u +%s
1467780345
1467780345
Совместное сопоставление выходных данных на самом деле не двойственно tee
. tee
делает несколько копий своих входных данных, в то время как сопоставление выходных данных не требует объединения данных.
Чтобы объединить источники вывода, просто перенаправьте их все на один и тот же файловый дескриптор. Чередование источников в целом несколько непредсказуемо, но достаточно небольшие записи в канал гарантированно будут атомарными .(Способность различать границы со стороны чтения — это отдельная история .)
{ data_source_1 &
data_source_2 &
wait; } >merged_output
Если вы получаете входные данные от нескольких файловых дескрипторов и хотите их объединить, пропустите каждый из них.
{ cat <&3 & cat <&4 & wait; } >merged_ouput
Но обычно вы можете перенаправить все файловые дескрипторы в одно и то же место назначения.
… 3>merged_ouput 4>&3
Вам нужно добавить STDERR и STDOUT в STDOUT в каждом процессе.
Пример:
процессA 2>&1 | процессБ | processC
STDOUT и STDERR будут перенаправлены через PIPE в качестве STDIN для processB. Однако processC получит только STDOUT ProcessB как STDIN.
Итак, если вам нужны STDOUT и STDERR процесса B в качестве STDIN для процесса C, это будет:
процессA 2>&1 | процессB 2>&1 | processC
Если вы действительно не хотите использовать конвейеры, а хотите просто перенаправить весь вывод в один файл, вы можете сделать:
(processA; processB) >./just_STDOUT.txt
(процессA 2>&1; процессB 2>&1) >./STDOUT_AND_STDERR.txt