同じ画面でループするスクリプトを作成する

同じ画面でループするスクリプトを作成する

私のスクリプトには単純な問題が 1 つあります。同じ画面に行スクリプトが必要なのですが、上記の最後の情報が表示されません。デモ コードを参照してください。

#!/bin/bash

if [ -t 0 ]; then stty -echo -icanon -icrnl time 0 min 0; fi
#result=`sensors -A`
count=0
keypress=''
echo -ne "linha 1\nLinha 2\n " > /tmp/temp_script.log
while [ "x$keypress" = "x" ]; do    
  clear  
  let "count++" 
  output="$(cat /tmp/temp_script.log)"
  printf  "$output"\\b
  echo -en $count\\n
  sleep 1 
keypress="`cat -v`"
done
if [ -t 0 ]; then stty sane; fi
exit 0

結果コード:

現在のコード

この情報は、最初の例のような複数行を生成せず、2 番目の例のように問題の情報のループのみを表示する方法で表示する必要があります。

これどうやってするの:

私の目的

などなど、端末にはループの以前の印象はなく、現在印刷されているものだけが表示されます。

答え1

仮定すると、clearが本当に画面をクリアする場合、表示されるスクリプト自体は最初のスクリーンショットを生成しません。 に追加する追加のプロセスがあれば/tmp/temp_script.log、それが何かを行う可能性があります...

一方、ターミナルが画面をクリアしない場合は、それが問題の一部です。おそらく、その色付きの線はスクリプトを実行したプロンプトであり、それを画面の上部に表示し続けることができます。

  • TERM通常は、端末の説明に対応する適切な値に設定します。
  • 「適切な」端末の説明には、画面をクリアする方法が記載されています。
  • 副作用として、画面をクリアすると(慣例により)カーソルも画面の左上隅に移動しますが、
  • 画面の左上隅から画面をクリアすると、色付きの線もクリアされます(これはかもしれない維持したい)
  • 2行目から消去したい場合は、(ほとんどの端末では)次のようにします。
    printf '\033[2H\033[J'

または

    カップ1 0
    tput ed
  • ただし、プロンプトが元々画面上部にない場合は、だった画面上部はそのままです。

問題のもう 1 つの部分は、3 行が画面の下方向に繰り返し印刷されることです。これを変更して、カウンターを印刷する場所にカーソルを移動することができます。たとえば、

    printf '\033[4H'

または

    tputカップ30

これらをまとめると、スクリプトは次のようになります (および/または端末の説明printfに問題があるようなのでを使用しますTERM)。

    #!/bin/bash

    if [ -t 0 ]; then stty -echo -icanon -icrnl time 0 min 0; fi
    #結果=`センサー -A`
    カウント=0
    printf '\033[2H\033[J'
    キーを押す=''
    echo "ライン 1"
    エコー「Linha 2
    while [ "x$keypress" = "x" ]; 実行する    
      「count++」とします
      printf '\033[4H'
      $count をエコーする
      睡眠1
      キーを押す="`cat -v`"
    終わり
    if [ -t 0 ]; then stty sane; fi
    終了 0

参考文献:

関連情報