Para meu prompt personalizado powerlevel10k, atualmente tenho essa função para exibir os segundos desde a época, separados por vírgula. Eu o mostro na hora atual para que eu sempre tenha uma dica para lembrar aproximadamente qual é a hora da época atual.
function prompt_epoch() {
MYEPOCH=$(/bin/date +%s | sed ':a;s/\B[0-9]\{3\}\>/,&/;ta')
p10k segment -f 66 -t ${MYEPOCH}
}
Me disseram que posso fazer isso sem os processos bifurcados usando estes comandos:
$ zmodload -F zsh/datetime p:EPOCHSECONDS
$ printf "%'d" $EPOCHSECONDS
1,648,943,504
Mas não sei como fazer isso sem a bifurcação. Eu sei adicionar a zmodload
linha no meu ~/.zshrc
antes que meu powerlevel10k seja originado, mas a formatação ${EPOCHSECONDS}
não é algo que eu saiba fazer sem um fork.
Se eu estivesse fazendo do jeito que eu sei, isso é o que eu faria:
function prompt_epoch() {
MYEPOCH=$(printf "%'d" ${EPOCHSECONDS})
p10k segment -f 66 -t ${MYEPOCH}
}
Mas até onde eu entendo, isso ainda está bifurcando um processo toda vez que o prompt é chamado, correto? Estou entendendo mal o conselho dado porque não acho que posso ver uma maneira de obter os últimos segundos da época sem executar algum tipo de processo, que requer um fork, correto?
O
printf
utilitário em ambosbash
ezsh
tem uma-v
opção que permite "imprimir em uma variável":O resultado real do comando acima pode depender da localidade atual.
FWIW, você também pode fazer:
Para obter algo como
1,648,989,768
no prompt certo sem bifurcar um processo nem depender da localidade para o valor do separador de milhares.${param:fs/left/right}
usa o modificador de históricos
substituto como em csh, enquanto aquele o repete enquanto muda algo, alcançando algo semelhante à sua abordagem GNU.f
sed
Com a
histsubstpattern
opção habilitada,left
pode ser um padrão, então$param:s/left/right
se comporta como ksh93,${param/pattern/replacement}
exceto que podemos combiná-lo com aquelef
modificador que o torna mais útil aqui.Como com ksh93's
${param/pattern/replacement}
, o padrão pode ser precedido por%
para corresponder apenas no final do assunto. Comextendedglob
, podemos habilitar back-references com(#b)
ou usar(#c3)
para combinar 3 do átomo anterior como ERE's{3}
.Observe que ao lado
$EPOCHSECONDS
(para o qual você precisa carregar ozsh/datetime
módulo), o tempo de época também pode ser obtido com a%D{%s}
expansão do prompt. Para poder aplicar um modificador nele, você teria que expandi-lo como parte da expansão do parâmetro. Isso pode ser feito com o%
sinalizador de expansão do parâmetro: