Есть ли противоположность «тройнику» - потоковая передача нескольких каналов вместе?

Гораздо проще измерить время в секундах, начиная с эпохи ( +% 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
3
10.05.2017, 18:01
2 ответа

Совместное сопоставление выходных данных на самом деле не двойственно tee. teeделает несколько копий своих входных данных, в то время как сопоставление выходных данных не требует объединения данных.

Чтобы объединить источники вывода, просто перенаправьте их все на один и тот же файловый дескриптор. Чередование источников в целом несколько непредсказуемо, но достаточно небольшие записи в канал гарантированно будут атомарными .(Способность различать границы со стороны чтения — это отдельная история .)

{ data_source_1 &
  data_source_2 &
  wait; } >merged_output

Если вы получаете входные данные от нескольких файловых дескрипторов и хотите их объединить, пропустите каждый из них.

{ cat <&3 & cat <&4 & wait; } >merged_ouput

Но обычно вы можете перенаправить все файловые дескрипторы в одно и то же место назначения.

… 3>merged_ouput 4>&3
6
27.01.2020, 21:15

Вам нужно добавить 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

0
27.01.2020, 21:15

Теги

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