La página de manual de bash enumera tres y sólo tres códigos de formato reconocidos por la versión integrada del shell time
: %R
para el tiempo real, %U
para el tiempo invertido en el espacio de usuario y %S
para el tiempo invertido en llamadas al sistema. Entonces el siguiente comportamiento es confuso por decir lo menos:
$ type time
time is a shell keyword
$ TIMEFORMAT="%E %P"
$ time sleep 1
1.002 0.00
Es evidente que algo se está dejando fuera de la página de manual. El incorporado time
reconoce %E
y %P
. Sin embargo, verifiqué todas las demás letras mayúsculas y minúsculas y no se reconoce ninguna, excepto l
como modificador:
$ TIMEFORMAT="%lE %lS %lU %lR"
$ time sleep 1
0m1.001s 0m0.000s 0m0.000s 0m1.001s
Tengo curiosidad por entender qué está pasando aquí: ¿es realmente solo una omisión en la página de manual o hay algo extraño en mi bash? Idealmente, ¿alguien puede indicarme alguna documentación que explique esto? Estoy usando bash 4.2.48(1) en Gentoo amd64 estable, si es importante.
Respuesta1
Desde elsección de execute_cmd.c
debash-4.2+dfsg
que se ocupa de 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;
}
Entonces, de lo anterior, parece que %E
significa lo mismo que %R
: tiempo transcurrido (real).
He visto algo similar en GNU sed
. Está documentado que la -r
opción habilita las expresiones regulares extendidas de sed. Una característica no documentada es que -E
hace lo mismo. En este caso, el propósito es claro: proporciona compatibilidad con el indicador que BSD sed
usa para expresiones regulares extendidas. Una posible razón para mantenerlo sin documentar sería que le permite a GNU la opción de usarlo -E
para otra cosa en el futuro. Las razones para permitir %E
TIMEFORMAT pero mantenerlo sin documentar pueden ser similares.