Printf 格式化 ZSH 变量而不分叉?

acj*_*ca2 4 zsh printf

对于我的 powerlevel10k 自定义提示,我目前有此功能来显示自纪元以来的秒数,以逗号分隔。我将它显示在当前时间下,这样我总是有一个提示来大致记住当前纪元时间是什么。

function prompt_epoch() {
  MYEPOCH=$(/bin/date +%s | sed ':a;s/\B[0-9]\{3\}\>/,&/;ta')
  p10k segment -f 66 -t ${MYEPOCH}
}
Run Code Online (Sandbox Code Playgroud)

我的提示看起来像这样: 提示示例截图

有人告诉我可以使用以下命令在没有分叉进程的情况下执行此操作:

$ zmodload -F zsh/datetime p:EPOCHSECONDS
$ printf "%'d" $EPOCHSECONDS
1,648,943,504
Run Code Online (Sandbox Code Playgroud)

但我不确定如何在不分叉的情况下做到这一点。我知道在获取 powerlevel10k 之前zmodload在 my 中添加该行,但是我不知道如何在没有 fork 的情况下进行格式化。~/.zshrc${EPOCHSECONDS}

如果我按照我知道的方式做,这就是我会做的:

function prompt_epoch() {
  MYEPOCH=$(printf "%'d" ${EPOCHSECONDS})
  p10k segment -f 66 -t ${MYEPOCH}
}
Run Code Online (Sandbox Code Playgroud)

但据我了解,每次调用提示时仍然会分叉一个进程,对吗?我是否误解了给出的建议,因为我认为我无法找到一种方法来获取最新纪元秒数而不运行某种需要分叉的进程,对吗?

Kus*_*nda 7

printf中的实用程序都有一个允许您“打印到变量”的选项:bashzsh-v

printf -v MYEPOCH "%'d" ${EPOCHSECONDS}
Run Code Online (Sandbox Code Playgroud)

上述命令的实际结果很可能取决于当前区域设置。