Wie gehe ich beim Lesen mit der Rücktaste um?

10

Wie gehe ich mit den eingegebenen Backspaces um? Es wird angezeigt, ^?ob versucht wurde und wie readdie Zeichen gezählt wurden, da 12^?3bereits 5 Zeichen vollständig waren (obwohl alle nicht tatsächlich eingegeben wurden), aber nachdem 12^?3^?die Eingabeaufforderung zurückgegeben wurde, seltsam. Bitte helfen Sie!

-bash-3.2$ read -n 5
12^?3^?-bash-3.2$
Keyshov Borate
quelle

Antworten:

10

Wenn Sie eine ganze Zeile mit Plain read(oder read -randeren Optionen, die dieses Verhalten nicht beeinflussen) lesen, erkennt der vom Kernel bereitgestellte Zeileneditor den BackspaceSchlüssel zum Löschen eines Zeichens sowie einige andere Befehle (einschließlich Returnzum Beenden der Eingabe) Linie und senden Sie es). Die Tastenkombinationen können mit dem Dienstprogramm konfiguriert werdenstty . Das Terminal befindet sich im gekochten Modus, wenn sein Zeileneditor aktiv ist. Im Raw-Modus wird jedes auf der Tastatur eingegebene Zeichen sofort an die Anwendung übertragen. Im gekochten Modus werden die Zeichen in einem Puffer gespeichert und nur vollständige Zeilen an die Anwendung übertragen.

Um das Lesen nach einer festgelegten Anzahl von Zeichen zu beenden read -n, muss Bash in den Raw-Modus wechseln. Im Raw-Modus verarbeitet das Terminal die BackspaceTaste nicht (zum Zeitpunkt des Drückens Backspacewurde das vorhergehende Zeichen bereits an bash gesendet), und bash führt auch keine Verarbeitung durch (vermutlich, weil dies die größere Flexibilität bietet dem Skript zu erlauben, seine eigene Verarbeitung durchzuführen).

Sie können die Option übergeben -e, um den eigenen Zeileneditor von bash zu aktivieren (readline, ein geeigneter Zeileneditor, der dem extrem groben des Kernels nicht ähnlich ist). Da bash die Zeilenausgabe ausführt, kann es das Lesen beenden, sobald es die angeforderte Anzahl von Zeichen hat.

Gilles 'SO - hör auf böse zu sein'
quelle
9

Verwendung read -e:

$ read -e -n 5
13acX

read -e bedeutet, dass:

Readline (siehe Befehlszeilenbearbeitung ) wird verwendet, um die Zeile abzurufen .

Wenn Sie dies tun, können Sie die Eingabe auf eine der folgenden Arten bearbeiten, wie Sie es beim Schreiben an der regulären Shell-Eingabeaufforderung tun würden, einschließlich Rücktaste Homeusw.

Michael Homer
quelle
1

readist eine eingebaute Bash. (siehe type read.) Dokumentation finden Sie mit 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.

oder Sie können verwenden 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

Der -eSwitch aktiviert die Readline-Unterstützung, die grundsätzlich alle an der Shell-Eingabeaufforderung verfügbaren Funktionen einschließlich der Rücktastenbehandlung ermöglicht.

Deshalb read -en 5sollte man machen was man will.

michas
quelle
-e löst das Problem, aber wie readdie 'Anzahl der eingegebenen Zeichen' gelesen wird, bleibt immer noch unbeantwortet.
Keyshov Borate