Страница руководства bash содержит три и только три форматных кода, распознаваемых встроенной версией оболочки time
: %R
для реального времени, %U
для времени, проведенного в пользовательском пространстве, и %S
для времени, проведенного в системных вызовах. Поэтому следующее поведение, мягко говоря, сбивает с толку:
$ type time
time is a shell keyword
$ TIMEFORMAT="%E %P"
$ time sleep 1
1.002 0.00
Очевидно, что-то упущено из страницы руководства. Встроенная функция time
распознает %E
и %P
. Однако я проверил все остальные заглавные и строчные буквы, и ни одна из них не распознается, за исключением l
модификатора:
$ TIMEFORMAT="%lE %lS %lU %lR"
$ time sleep 1
0m1.001s 0m0.000s 0m0.000s 0m1.001s
Мне интересно понять, что здесь происходит - это действительно просто упущение в man-странице или что-то странное в моем bash? В идеале, может ли кто-нибудь указать мне на документацию, которая это объясняет? Я использую bash 4.2.48(1) на Gentoo amd64 stable, если это имеет значение.
решение1
Израздел execute_cmd.c
изbash-4.2+dfsg
который занимается TIMEFORMAT
:
if (*s == 'R' || *s == 'E')
len = mkfmt (ts, prec, lng, rs, rsf);
else if (*s == 'U')
len = mkfmt (ts, prec, lng, us, usf);
else if (*s == 'S')
len = mkfmt (ts, prec, lng, ss, ssf);
else
{
internal_error (_("TIMEFORMAT: `%c': invalid format character"), *s);
free (str);
return;
}
Итак, из вышесказанного следует, что это %E
означает то же самое, что и %R
: прошедшее (реальное) время.
Я видел что-то похожее в GNU sed
. Эта -r
опция задокументирована как включение расширенных регулярных выражений sed. Недокументированная функция -E
делает то же самое. В этом случае цель ясна: это обеспечивает совместимость с флагом, который BSD sed
использует для расширенных регулярных выражений. Одной из возможных причин оставить ее недокументированной может быть то, что она позволяет GNU использовать опцию -E
для чего-то еще в будущем. Причины разрешить %E
TIMEFORMAT, но оставить ее недокументированной, могут быть похожими.