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 但不記錄它的原因可能是類似的。

相關內容