私のスクリプトには単純な問題が 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
参考文献: