对于我的 powerlevel10k 自定义提示,我目前有这个功能来显示自纪元以来的秒数,逗号分隔。我在当前时间下显示它,所以我总是有一个提示来大致记住当前的纪元时间。
function prompt_epoch() {
MYEPOCH=$(/bin/date +%s | sed ':a;s/\B[0-9]\{3\}\>/,&/;ta')
p10k segment -f 66 -t ${MYEPOCH}
}
有人告诉我,我可以在没有使用这些命令的分叉进程的情况下做到这一点:
$ zmodload -F zsh/datetime p:EPOCHSECONDS
$ printf "%'d" $EPOCHSECONDS
1,648,943,504
但我不确定如何在没有分叉的情况下做到这一点。我知道在获取powerlevel10k 之前在我的行中添加该zmodload
行,但格式化不是我知道如何在没有叉子的情况下做的事情。~/.zshrc
${EPOCHSECONDS}
如果我按照我知道的方式做,我会这样做:
function prompt_epoch() {
MYEPOCH=$(printf "%'d" ${EPOCHSECONDS})
p10k segment -f 66 -t ${MYEPOCH}
}
但据我了解,每次调用提示时仍然会分叉一个进程,对吗?我是否误解了给出的建议,因为我认为我无法在不运行某种需要分叉的进程的情况下获得最新的纪元秒数,对吗?
两者中的
printf
实用程序都有一个允许您“打印到变量”的选项:bash
zsh
-v
上述命令的实际结果很可能取决于当前的语言环境。
FWIW,您还可以执行以下操作:
要
1,648,989,768
在正确的提示中得到类似的东西,而不需要分叉进程,也不需要依赖语言环境来获取千位分隔符的值。${param:fs/left/right}
像在 csh 中一样使用s
ubstitute历史修饰符f
,而只要它改变了一些东西,它就会重复它,实现类似于你的 GNUsed
方法的东西。histsubstpattern
启用该选项后,left
它可以是一种模式,因此$param:s/left/right
其行为类似于 ksh93 ,${param/pattern/replacement}
除了我们可以将它与该f
修饰符结合使用,这使得它在这里更有用。与 ksh93's 一样
${param/pattern/replacement}
,模式前面%
可以匹配仅在主题的末尾。使用extendedglob
,我们可以启用反向引用(#b)
或使用(#c3)
来匹配前面的 3 个原子,如 ERE 的{3}
。注意除了
$EPOCHSECONDS
(需要加载zsh/datetime
模块),epoch时间也可以通过%D{%s}
提示展开获取。为了能够对其应用修饰符,您必须将其作为参数扩展的一部分进行扩展。这可以通过%
参数扩展标志来完成: