コマンドプロンプトにコマンド情報を入力し、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
もう1つのアプローチは、出力を処理する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