명령 프롬프트의 가동 시간 정보가 업데이트되었습니다.

명령 프롬프트의 가동 시간 정보가 업데이트되었습니다.

명령 프롬프트에 명령 정보를 입력하고 750밀리초마다 업데이트 하고 싶습니다 uptime(프롬프트에 입력하는지 여부에 관계 없음).

나는 그것을 많이 사용 bash하지만, 또한 그것을 사용해 본 적이 zsh있어서 여기까지 왔습니다. 충분 하지 않다고 생각합니다 bash. 도움을 주시면 감사하겠습니다.


이 게시물을 놓쳐서 죄송합니다.

예상되는 프롬프트는 다음과 같습니다.

10:07:09 up 54 min,  7 users,  load average: 0.23, 0.38, 0.44
~/Videos ($)

작업 디렉토리 뒤의 괄호 안에 권한 수준 식별자가 있다는 아이디어가 마음에 듭니다. 그러면 가동 시간 정보가 주기적으로 업데이트되지만 반드시 750밀리초일 필요는 없습니다.

다시 한 번 더 많은 정보를 제공하지 못해 죄송합니다.

미리 감사드립니다.

답변1

그리고 zsh:

TRAPALRM() { psvar[1]=$(uptime); zle reset-prompt; }
RPS1='%1v'
TMOUT=1

uptime올바른 프롬프트에서 매초마다 출력이 업데이트됩니다. 750밀리초 동안은 $TMOUT정수만 허용하는 대소문자를 사용할 수 없습니다 .

다음을 수행할 수 있습니다.

zmodload zsh/zselect
RPS1='%1v'
TRAPALRM() {
  (zselect -t 75; kill -s ALRM $$ 2> /dev/null) &|
  psvar[1]=$(uptime)
  [[ -z $WIDGET ]] || zle reset-prompt
}
precmd_functions+=(TRAPALRM)

zle -F또 다른 접근 방식은 출력을 처리하는 coproc으로 750밀리초마다 가동 시간을 보내는 루프를 사용하는 것입니다 coproc.

zmodload zsh/system
zmodload zsh/zselect
UPTIME_TMOUT=
coproc {
  while true; do
    zselect -r 0 ${UPTIME_TMOUT:+-t} $UPTIME_TMOUT
    case $? in
      (0) IFS= read UPTIME_TMOUT || exit
          [[ -n $UPTIME_TMOUT ]] || continue;;
      (1) ;;
      (*) exit 1;;
    esac
    uptime
  done
}
sysopen -wu UPTIME_TO   -o cloexec /dev/fd/3 3>&p
sysopen -ru UPTIME_FROM -o cloexec /dev/fd/3 3<&p

handle_uptime_event() {
  if ! IFS= read -ru $UPTIME_FROM 'psvar[1]'; then
    zle -F $UPTIME_FROM
    exec {UPTIME_FROM}<&- {UPTIME_TO}>&-
    unset UPTIME_TO UPTIME_FROM
  fi
  zle reset-prompt
}

start_uptime_loop() {
  (($+UPTIME_TO)) && print -u $UPTIME_TO 75
}
stop_uptime_loop() {
  (($+UPTIME_TO)) && print -u $UPTIME_TO
}
zle -F $UPTIME_FROM handle_uptime_event
precmd_functions+=(start_uptime_loop)
preexec_functions+=(stop_uptime_loop)

RPS1=%1v

관련 정보