내 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}
}
하지만 내가 아는 바로는 프롬프트가 호출될 때마다 프로세스가 계속 분기됩니다. 그렇죠? 포크가 필요한 프로세스를 실행하지 않고는 최신 에포크 초를 얻을 수 있는 방법을 찾을 수 없다고 생각하기 때문에 주어진 조언을 오해하고 있는 것일까요?
답변1
printf
의 유틸리티에는 " 변수로 인쇄"할 수 있는 옵션이 있습니다.bash
zsh
-v
printf -v MYEPOCH "%'d" ${EPOCHSECONDS}
위 명령의 실제 결과는 현재 로케일에 따라 달라질 가능성이 높습니다.
답변2
FWIW, 다음과 같이 할 수도 있습니다.
zmodload zsh/datetime
set -o histsubstpattern -o promptsubst -o extendedglob
RPS1='$EPOCHSECONDS:fs/%(#b)([^,])([^,](#c3)(|,*))/$match[1],$match[2]'
1,648,989,768
천 단위 구분 기호 값을 얻기 위해 프로세스를 분기하거나 로케일에 의존하지 않고 올바른 프롬프트 와 같은 것을 얻으십시오 .
${param:fs/left/right}
s
대안 사용기록 수정자csh와 마찬가지로 f
무언가 변경될 때마다 이를 반복하여 sed
GNU 메소드와 유사한 것을 구현합니다.
이 histsubstpattern
옵션을 활성화 하면 left
패턴이 될 수 있으므로 이 수정자와 결합 할 수 있다는 점을 제외하면 $param:s/left/right
동작은 ksh93과 유사하므로 여기서는 더 유용합니다.${param/pattern/replacement}
f
ksh93 과 마찬가지로 ${param/pattern/replacement}
패턴 앞에는 %
주제의 끝에서만 일치할 수 있습니다. 를 사용하면 extendedglob
역참조를 활성화 (#b)
하거나 (#c3)
ERE의 처럼 이전 3개 원자를 일치시키는 데 사용할 수 있습니다 {3}
.
$EPOCHSECONDS
모듈을 로드해야 하는 이 외에도 zsh/datetime
힌트 확장을 통해 에포크 시간을 얻을 수도 있습니다 %D{%s}
. 수정자를 적용하려면 매개변수 확장의 일부로 확장해야 합니다. 이는 %
매개변수 확장 플래그를 통해 수행할 수 있습니다:
set -o histsubstpattern -o promptsubst -o extendedglob
RPS1='${${(%):-"%D{%s}"}:fs/%(#b)([^,])([^,](#c3)(|,*))/$match[1],$match[2]}'