
私はコマンドを持っています:ps -o pid,user,%cpu,command | head -n 30
上記のコマンドの出力を印刷して更新したいのですが、端末全体(alacrtty)を更新せずに以前と同じ出力を印刷し続けたいと思います。
デフォルトでは、目的はスクリプトを実行し、psコマンドの変更をリアルタイムで観察することです。しかし、現在のプロンプト位置を台無しにせず、端末を更新せずに(ちらつきを引き起こす可能性があります)。
コマンドを試しましたが、watch
ターミナル/ tmuxウィンドウ全体を占有しました。
私もtputを試しましたが、うまくいきませんでした。
まず、ありがとうございます。
答え1
ターミナルカーソルの下に少なくとも30行があり、ターミナルがこれらのエスケープシーケンスをサポートしていると仮定すると、sc
(カーソルの保存)およびrc
(カーソルの復元)エスケープシーケンスを使用できます。
tput sc
while true; do
tput ed
ps -o pid,user,%cpu,command | head -n 30
tput rc
sleep 1
done
(/ /...をサポートしていない場合はechoti sc
orも参照してください)。$terminfo[sc]
zsh
tput
sc
rc
ed
実行中にカーソルを非表示にし、プロンプトが表示される前にこれを実行していないシェル割り込みが発生するたびに画面の下部をクリアするには、これを実行できます。
my_processes() (
trap 'tput rc; tput ed; tput cnorm; exit' EXIT INT
tput sc; tput civis
while true; do
tput ed
ps -o pid,user,%cpu,command | head -n 30
tput rc
sleep 1
done
)
ed
シーケンスと出力の間の遅延を減らして、ちらつきを減らすことができますps
。
my_processes() (
for c in sc rc ed cnorm civis; do eval "$c=\$(tput $c)"; done
trap 'printf %s "$rc$ed$cnorm"; exit' EXIT INT
printf %s "$sc$civis"
while true; do
printf %s "$ed$(ps -o pid,user,%cpu,command | head -n 30)$rc"
sleep 1
done
)
これらのterminfo
機能はマニュアルページに記載されていますterminfo(5)
。
sc
:現在のカーソル位置を保存します。rc
:カーソルをsave_cursor
最後の位置に復元します。ed
:画面の最後までクリアcivis
:カーソルを見えないようにします。cnorm
:カーソルが正常に表示されるようにします(元に戻すcivis
/cvvis
)。cuu <n>
1:カーソルが上に<n>
移動します。
(zsh
このすべての$sc
/ $rc
...変数宣言をスキップして$terminfo[sc]
...を使用できます。)
zleでは、zsh
スケジューラを使用してps
シェルを引き続き使用できますが、zleメッセージ領域に出力を表示することもできます。
zmodload zsh/sched
my-processes() {
if [[ $1 = stop ]]; then
sched -$zsh_scheduled_events[(i)*:$0]
else
if {zle} zle -M "$(ps -o pid,user,%cpu,command | head -n 30)"
sched +1 $0
fi
}
ジョブがmy-processes
開始および停止さmy-processes stop
れます。次のキーを押してオンとオフを切り替えることができます。
toggle-my-processes() {
local event
if (( event = zsh_scheduled_events[(I)*:my-processes] )); then
sched -$event
zle redisplay
else
my-processes
fi
}
zle -N toggle-my-processes
bindkey '\ep' toggle-my-processes
(ここで囲まれているのは、通常+を押すと端末から送信されるESC
p
文字列です。)AltP
yes '' | head -n30; tput cuu 30
必要に応じて実行して、カーソルの下に30行があることを確認できます。ただし、報告するプロセスの数が少ない場合、これは不要な場合があります。