文字列を印刷するために端末でカーソルを上にスクロールする方法は?

文字列を印刷するために端末でカーソルを上にスクロールする方法は?

aircrack-ngここでは、端末画面にテキストを表示したり、マトリックススクリプトのようなものが欲しい...!

たとえば、私の端末画面にすでに4行が含まれている場合は、最初の行をその場所に更新し、他の行も同じように更新したいとします(bashを使用)

より正確には、次のスクリプトが必要です。

#!/bin/bash
while :
  do
    echo "line1"
    echo "line2"
    echo "line3"
    echo "line4"
    # without using clear cmd, next cycle line1 should be printed
    # in line1 place not in a new line , and same for other lines
  done

答え1

これをサポートする端末では、次を使用してカーソルtput sc位置を保存およびtput rc復元できます。

i=0
tput sc
while sleep 1; do
  tput rc
  echo "line$((i=i+1))"
  echo "line$((i=i+1))"
  echo "line$((i=i+1))"
  echo "line$((i=i+1))"
done

出力

tput各呼び出しを避けるために、これらのエスケープシーケンスを変数に保存できます。

rc=$(tput rc) ||
  echo >&2 "Warning: terminal doesn't support restoring the cursor"
...
printf '%s\n' "${rc}line1..."

これをサポートしていないまれな端末では、常にカーソル位置決め順序を使用できます。

while sleep 1; do
  echo "line$((i=i+1))"
  echo "line$((i=i+1))"
  echo "line$((i=i+1))"
  echo "line$((i=i+1))"
  tput cuu 4 # or up=$(tput cuu1); printf %s "$up$up$up$up"
done

詳細については、terminfoセクション5のマニュアルページを参照してください(システムにncursesが提供されている場合)。

答え2

私は数ヶ月前にStackOverflowでこの質問に答えました。最後の端末出力を上書きする(複数行)。そう思うけど可能文字通り「line1」、「line2」などを印刷してOPが意味するのは教室の実習でのみ興味があるはずです。実際のプログラムはより興味深い内容を印刷するので、私は答えます。それ質問。以前と同様に、現在のq / aは、更新された行が既存の行よりも短い場合、この問題を無視します。この問題を解決する

#!/bin/bash
tput sc
while :
  do
    tput rc
    echo "line1"; tput el
    echo "line2"; tput el
    echo "line3"; tput el
    echo "line4"; tput el
    # without using clear cmd, next cycle line1 should be printed
    # in line1 place not in a new line , and same for other lines
  done

これがcuu良い選択肢であることに同意してくださいgrep。機能の可用性を確認するために使用することは、tputそれ自体を使用するよりも効果が少なくなります。

restore=$(tput sc)
[[ -z "$restore" ]] && restore=$(tput cuu 4)
[[ -z "$restore" ]] && restore=$(tput cuu1; tput cuu1; tput cuu1; tput cuu1)

式に行番号を挿入する方法はまだやや粗雑です。しかし、$restoreループが終わったらそれを行うことができます。

el端末をチェックインすると同様のことができます。

これがbashの場合などecho "line1"は実際には関数でなければなりません(冗長呼び出しを削除しますtput el)。

OPに触れることができる端末は、これらの機能をすべてサポートできます。カーソル制御の保存/復元には2つの主な変形があるため、弱点です。

  • DECSC/ DECRC(xtermでサポート - 参照XTerm制御シーケンス):

    ESC 7     Save Cursor (DECSC).
    ESC 8     Restore Cursor (DECRC).
    
  • ANSI.SYS(xtermでもサポートされていますが、すべての「xtermエミュレータ」はサポートされていません):

    CSI s     Save cursor (ANSI.SYS), available only when DECLRMM is disabled.
    CSI u     Restore cursor (ANSI.SYS).
    

その他の有用な情報源:

ちなみに、この質問のタイトルは(これまでの回答がない)与えられた例では次のように使用されているため、間違っています。スクロール。スクロール領域を使用するには(terminfoをもう一度参照し、xtermなどのVT100に似た端末に制限する)ことができます。始める場所はここです(terminfoのマニュアルページから):

   change_scroll_region          csr        cs        change region to      
                                                      line #1 to line #2    
                                                      (P)   

関連情報