現在のプロンプト位置を占めていないコマンドのリアルタイム出力?

現在のプロンプト位置を占めていないコマンドのリアルタイム出力?

私はコマンドを持っています: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 scorも参照してください)。$terminfo[sc]zshtputscrced

実行中にカーソルを非表示にし、プロンプトが表示される前にこれを実行していないシェル割り込みが発生するたびに画面の下部をクリアするには、これを実行できます。

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行があることを確認できます。ただし、報告するプロセスの数が少ない場合、これは不要な場合があります。

おすすめ記事