ユーザー挿入プロンプトの右側に文字列を表示する方法

ユーザー挿入プロンプトの右側に文字列を表示する方法

簡単なスクリプトがあります

#!/bin/bash
SENTENCE=""
while read word
do
    SENTENCE="$SENTENCE $word"
done

ユーザーとのやりとりにより、次のことが発生する可能性があります。

a
a
b
a b
c
a b c
d
a b c d

ユーザーと同じ行の右側に文字列を表示して出力を取得する方法

a                                 a
b                                 a b
c                                 a b c
d                                 a b c d

答え1

最も単純な場合(短い単語、改行なし、画面の最後までスクロールする心配なし)を想定すると、次のことができます。

#!/bin/bash
SENTENCE=""
tput sc
while read word
do
    SENTENCE="$SENTENCE $word"
    tput rc
    tput hpa 20
    printf '%s\n' "$SENTENCE"
    tput sc
done

これは、使用するほとんどの端末記述にある2つの端末機能を使用します。

  • カーソル位置の保存/復元(scそしてrcパラメータ)と
  • 垂直地位(hpa範囲)。

そのエスケープシーケンスをハードコードできますが、そうすると読みやすくなります。

しかし、一部は上向き矢印エスケープを使用することを提案するかもしれませんが、これは画面の最後でスクロールするのと同じ問題があり、この問題も発生します\e[FCPL端末の説明にはありません)。

水平に移動するには、パラメータで右カーソルを使用できます。たとえば、次のようになります。

tput cuf 20

これは〜になります\e[20C

質問の最後にコメントがあります\e[1aただし、ANSIエスケープシーケンスは大文字と小文字によって異なり、これは次のように一致します。\e[1A(カーソルを1行上に移動)おそらくあなたはこのように考えています。

#!/bin/bash
SENTENCE=""
while read word
do
    SENTENCE="$SENTENCE $word"
    tput cuu1
    tput hpa 20
    printf '%s\n' "$SENTENCE"
done

これより読みやすいです。

#!/bin/bash
SENTENCE=""
while read word
do
    SENTENCE="$SENTENCE $word"
    echo -en '\e[A'
    echo -en '\e[20C'
    echo "$SENTENCE"
done

関連情報