A página de manual do bash lista três e apenas três códigos de formato reconhecidos pela versão interna do shell time
: %R
para o tempo real, %U
para o tempo gasto no espaço do usuário e %S
para o tempo gasto em chamadas do sistema. Portanto, o seguinte comportamento é confuso, para dizer o mínimo:
$ type time
time is a shell keyword
$ TIMEFORMAT="%E %P"
$ time sleep 1
1.002 0.00
Claramente algo está sendo deixado de fora da página de manual. O embutido time
é reconhecer %E
e %P
. Porém verifiquei todas as outras letras maiúsculas e minúsculas e nenhuma delas é reconhecida, exceto l
como modificador:
$ TIMEFORMAT="%lE %lS %lU %lR"
$ time sleep 1
0m1.001s 0m0.000s 0m0.000s 0m1.001s
Estou curioso para entender o que está acontecendo aqui - isso é realmente apenas uma omissão na página de manual ou há algo estranho na minha festa? Idealmente, alguém pode me indicar alguma documentação que explique isso? Estou usando o bash 4.2.48(1) no Gentoo amd64 estável, se for importante.
Responder1
Deseção de execute_cmd.c
debash-4.2+dfsg
que trata 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;
}
Portanto, pelo exposto, parece que %E
significa o mesmo que %R
: tempo decorrido (real).
Eu vi algo semelhante no GNU sed
. A -r
opção está documentada como habilitando expressões regulares estendidas do sed. Um recurso não documentado é que -E
faz a mesma coisa. Neste caso, o propósito é claro: isto fornece compatibilidade com o sinalizador que o BSD sed
usa para regex estendido. Uma possível razão para mantê-lo sem documentação seria que ele permite ao GNU a opção de usá-lo -E
para outra coisa no futuro. As razões para permitir %E
o TIMEFORMAT, mas mantê-lo sem documentação, podem ser semelhantes.