명령 프롬프트에 명령 정보를 입력하고 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