読むときにバックスペースを処理する方法は?

読むときにバックスペースを処理する方法は?

入力のバックスペースキーをどのように処理しますか? 5つの文字がすでに完了しているので(実際に入力された文字が1つもないにもかかわらず)、プロンプトに戻ると、奇妙に試みられたかどうか、および^?文字のread計算方法が表示されます。 。助けてください!12^?312^?3^?

-bash-3.2$ read -n 5
12^?3^?-bash-3.2$

答え1

read通常(またはこの動作に影響を与えない他のオプション)を使用して行全体を読み取ると、read -rカーネル提供の行エディタは、あるBackspace文字と他の文字を消去するキーを認識します。注文するReturn入力ラインの完成と転送を含む)ショートカットは次のとおりです。設定そしてstty便利です。ラインエディタが有効になると、ターミナルがベーキングモードにあると言われます。生モードでは、キーボードに入力されたすべての文字がすぐにアプリケーションに送信されます。ベーキングモードでは、文字がバッファに保存され、完全な行だけがアプリケーションに送信されます。

実装する文字数が固定されてから読み取りを停止するには、read -nbashはrawモードに切り替える必要があります。 rawモードでは、ターミナルはキーを押しても何もしませんBackspace(キーを押すとBackspace前の文字がすでにbashに送信されます)、bashも何もしません(おそらくこれはより柔軟性があるからです)。自己処理)。

-ebashの独自のラインエディタ(カーネルの非常に粗雑なラインエディタではなく適切なラインエディタであるreadline)を有効にするオプションを渡すことができます。 Bashは行編集を実行するため、要求された文字数に達すると読み取りを停止します。

答え2

使用read -e:

$ read -e -n 5
13acX

read -e意味は次のとおりです

リードライン(参照コマンドラインの編集)は直線を求めるために使用されます。

これにより、バックスペースHomeなど、通常のシェルプロンプトで作成したときと同じ方法で入力を編集できます。

答え3

readbash 組み込み機能です。 (参照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好きなようにしてください。

関連情報