readlineへの入力はプロンプトよりも優先されます。

readlineへの入力はプロンプトよりも優先されます。

1-nで指定されたオプションを呼び出すか、コマンドのように呼び出すことができる対話型bashスクリプトを作成しようとしています。

最後に、シミュレーションプロンプトで表示され、「読み取り」を使用して入力を取得します。

ただし、大きすぎるテキストを入力すると、行の先頭に戻り、入力したプロンプトを上書きします。

プロンプトは色分けされており、エスケープ色を削除すると機能します。しかし、色は好きです:)

スクリプトプロンプトは次のとおりです。

NOC=$(echo -en '\033[0m')               # Default
RED=$(echo -en '\033[00;31m')
YELLOW=$(echo -en '\033[00;33m')
CYAN=$(echo -en '\033[00;36m')

OPROMPT="${RED}[Admin${CYAN}@${RED}bulletproof]#${NOC}"

until [ ! -z "$MCHOICE" ]; do
        read -p "${OPROMPT} " -e MCHOICE
done

この行動を止めるにはどうすればよいですか?把握できないようです。プロンプトを表示するためにechoまたはprintfを使用している場合は、何かを入力してバックスペースを押して変更すると削除されます。

わからない場合は、次のようになります。ヒントは次のとおりです(ぬり絵のみ:P)。

"[Admin@bulletproof]# "

...今、次のコマンドを入力してみてください。

"[Admin@bulletproof]# vpn start my"

...今続けて入力してください

"domain.lanletproof]# vpn start my"

いつするべきか:

"[Admin@bulletproof]# vpn start mydomain.lan"

また、端末ウィンドウのサイズによってバッファが異なることも確認しました。端子を最大化すると、同じ点で切断は開始されませんが、「許容差」が長くなります。

編集:この問題の「バッファリング」を大幅に改善する方法を見つけました。

コードを次のように設定すると:

until [ ! -z "$MCHOICE" ]; do
        printf "$OPROMPT"
        read -p " " -e MCHOICE
done

より長いテキストを入力できるようになります。理由はよくわかりません。

答え1

Bashは、端末から読み取るときに組み込み関数をreadline実行するときにreadこのライブラリを使用します。 readlineはコマンドラインを入力するときにも使用されます。改行を正しく処理するには、readlineはプロンプト文字列の文字が画面上のスペースを占有していないかどうかを知る必要があります。

Ctrl+ACでreadlineを呼び出す場合は、画面の色を変更するために使用されるエスケープシーケンスを(\001)とCtrl+B()で囲む必要があります。\002

Bashを使用すると、コマンドプロンプト変数(など)に割り当てるときに、対応する制御文字の代わりにおよびを使用できます\[。最新バージョンのgdbもこれをサポートしています。\]PS1PS2

明らかにbashはこれらの利便性を許可しませんread -p。したがって、これらの制御文字を使用する必要があります。

NOC=$'\001\e[0m\002'               # Default
RED=$'\001\e[00;31m\002'
YELLOW=$'\001\e[00;33m\002'
CYAN=$'\001\e[00;36m\002'

OPROMPT="${RED}[Admin${CYAN}@${RED}bulletproof]#${NOC}"

until [ ! -z "$MCHOICE" ]; do
        read -p "${OPROMPT} " -e MCHOICE
done

bash 4.4.23を使用してテストされました。

関連情報