私のbash(またはtcl)スクリプトが3つの列を連続して更新するようにしたいと思います。行の先頭に戻った後、いくつかの文字をスキップする方法がわかりません。行全体ではなく特定の情報を更新したいと思います。
私のスクリプトは、3種類のメッセージ(P1、P3、およびP7)のいずれかを送信する別のスクリプトの複数のインスタンスを並列に実行します。メッセージが送信されると、そのメッセージタイプに関連する列を更新する必要があります。
echoを使って次の内容を印刷したいと思います。
送信されたメッセージの数は次のとおりです。
P1:2 P3:1 P7:5
最初の行は静的で、2行目は動的です(2行目の数字は常に更新する必要があります)。 '\b' または '\r' を使用すると、文字を上書きせずに行から後ろに移動できます。しかし、古い文字を上書きせずに前進する方法は?一種の「逆方向」「\b」がありますか?
答え1
tput(1)
これに適している可能性があります。
#! /usr/bin/env bash
trap 'printf "\nbe seeing you\n"; exit' INT
clear
printf "blah de blah\n"
while [[ 1 ]]; do
tput cup 1 0
x=$(( RANDOM % 42 ))
y=$(( RANDOM / 42 ))
z=$(( RANDOM * 42 ))
printf "P1: %d P3: %d P7: %d\n" $x $y $z
sleep 1
done
答え2
(これはバッシュです)
printf "P1: 2 P3: 1 P7: 5\n"
printf "\033[2A\033[4C3\033[2B\r"
印刷しP1: 2 P3: 1 P7: 5
てからに変更しますP1: 3 P3: 1 P7: 5
。
端末エスケープコードを印刷する一般的な方法は次のとおりです。
\033 値 [ パスワード
ここでのサンプルコードは、A-カーソルの上、B-カーソルの下、C-カーソルの前方です。