bash 手册页列出了 shell 的内置版本可识别的三个且仅三个格式代码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
我很想了解这里发生了什么 - 这真的只是手册页中的遗漏,还是我的 bash 有什么奇怪的地方?理想情况下,任何人都可以向我指出一些解释这一点的文档吗?如果重要的话,我在 Gentoo amd64 stable 上使用 bash 4.2.48(1)。
答案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
做同样的事情。在这种情况下,目的很明确:这提供了与 BSDsed
用于扩展正则表达式的标志的兼容性。不记录它的一个可能原因是它允许 GNU-E
将来可以选择将其用于其他用途。允许%E
使用 TIMEFORMAT 但不记录它的原因可能是类似的。