분기하지 않고 Printf 형식 ZSH 변수를 사용하시겠습니까?

분기하지 않고 Printf 형식 ZSH 변수를 사용하시겠습니까?

내 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의 유틸리티에는 " 변수로 인쇄"할 수 있는 옵션이 있습니다.bashzsh-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무언가 변경될 때마다 이를 반복하여 sedGNU 메소드와 유사한 것을 구현합니다.

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]}'

관련 정보