読みながらバックスペースを処理する方法は?


10

入力されたバックスペースをどのように処理します^?か?試行されたかどうかread、および12^?3すでに5文字が完了したように文字を数える方法が表示されます(ただし、すべて実際の入力ではありませんでした)が12^?3^?、プロンプトが返された後、奇妙です。助けてください!

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

回答:


10

プレーンread(またはread -rこの動作に影響を与えないその他のオプション)で行全体を読み取る場合、カーネルが提供する行エディターは、Backspace1文字を消去するためのキーと、その他のごく少数のコマンドReturn入力を終了することを含む)を認識しますラインに入れて送信します)。ショートカットキーはユーティリティで設定できsttyます。端末は、その行エディターがアクティブであるとき、調理済みモードにあると言われます。rawモードでは、キーボードで入力された各文字がすぐにアプリケーションに送信されます。クックドモードでは、文字はバッファに格納され、完全な行のみがアプリケーションに送信されます。

を実装するために一定数の文字の後に読み取りを停止するにはread -n、bashをrawモードに切り替える必要があります。rawモードでは、端末はBackspaceキーの処理を行わず(を押すBackspaceまでに、前の文字はすでにbashに送信されています)、bashも処理を行いません(おそらくこれにより柔軟性が向上するためです)。スクリプトが独自の処理を実行できるようにするため)。

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


9

使用read -e

$ read -e -n 5
13acX

read -e という意味です:

行を取得するには、Readline(コマンドライン編集を参照)を使用します。

これを行うと、バックスペースなどの通常のシェルプロンプトで書き込むときと同じように入力を編集できますHome


1

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、あなたがしたいことをする必要があります。


-eは問題を解決しますがread、「入力された文字数」を読み取る方法はまだ答えられていません。
Keyshov Borate
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.