入力のバックスペースキーをどのように処理しますか? 5つの文字がすでに完了しているので(実際に入力された文字が1つもないにもかかわらず)、プロンプトに戻ると、奇妙に試みられたかどうか、および^?
文字のread
計算方法が表示されます。 。助けてください!12^?3
12^?3^?
-bash-3.2$ read -n 5
12^?3^?-bash-3.2$
答え1
read
通常(またはこの動作に影響を与えない他のオプション)を使用して行全体を読み取ると、read -r
カーネル提供の行エディタは、あるBackspace文字と他の文字を消去するキーを認識します。注文する(Return入力ラインの完成と転送を含む)ショートカットは次のとおりです。設定そしてstty
便利です。ラインエディタが有効になると、ターミナルがベーキングモードにあると言われます。生モードでは、キーボードに入力されたすべての文字がすぐにアプリケーションに送信されます。ベーキングモードでは、文字がバッファに保存され、完全な行だけがアプリケーションに送信されます。
実装する文字数が固定されてから読み取りを停止するには、read -n
bashはrawモードに切り替える必要があります。 rawモードでは、ターミナルはキーを押しても何もしませんBackspace(キーを押すとBackspace前の文字がすでにbashに送信されます)、bashも何もしません(おそらくこれはより柔軟性があるからです)。自己処理)。
-e
bashの独自のラインエディタ(カーネルの非常に粗雑なラインエディタではなく適切なラインエディタであるreadline)を有効にするオプションを渡すことができます。 Bashは行編集を実行するため、要求された文字数に達すると読み取りを停止します。
答え2
使用read -e
:
$ read -e -n 5
13acX
read -e
意味は次のとおりです
リードライン(参照コマンドラインの編集)は直線を求めるために使用されます。
これにより、バックスペースHomeなど、通常のシェルプロンプトで作成したときと同じ方法で入力を編集できます。
答え3
read
bash 組み込み機能です。 (参照type read
)次のように文書を見つけることができますman bash
。
read [-ers] [-a aname] [-d delim] [-i text] [-n nchars] [-N nchars] [-p prompt] [-t timeout] [-u fd] [name ...]
[...]
-e If the standard input is coming from a terminal, readline (see READLINE above) is used to obtain the line.
Readline uses the current (or default, if line editing was not previously active) editing settings.
または、次のものを使用できますhelp read
。
read: read [-ers] [-a array] [-d delim] [-i text] [-n nchars] [-N nchars] [-p prompt] [-t timeout] [-u fd] [name ...]
-e use Readline to obtain the line in an interactive shell
この-e
スイッチはreadlineサポートを有効にし、バックスペース処理を含むシェルプロンプトでデフォルトですべての機能を使用できるようにします。
だからread -en 5
好きなようにしてください。