bash 的内置时间接受 %E - 这是怎么回事?

bash 的内置时间接受 %E - 这是怎么回事?

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 但不记录它的原因可能是类似的。

相关内容