Come gestire il backspace durante la lettura?


10

Come gestisco i backspaces inseriti, mostra ^?se provato e come readconta i caratteri, come 12^?3già in 5 caratteri erano completi (sebbene tutti non fossero input effettivi), ma dopo 12^?3^?che ha restituito il prompt, strano. Per favore aiuto!

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

Risposte:


10

Quando leggi un'intera riga con semplici read(o read -ro altre opzioni che non influiscono su questo comportamento), l'editor di linee fornito dal kernel riconosce la Backspacechiave per cancellare un carattere, così come pochi altri comandi (incluso Returnper finire l'input linea e inviarlo). I tasti di scelta rapida possono essere configurati con l' sttyutilità. Si dice che il terminale sia in modalità Cotto quando il suo editor di linea è attivo. In modalità raw, ogni carattere digitato sulla tastiera viene immediatamente trasmesso all'applicazione. In modalità Cotto, i caratteri sono memorizzati in un buffer e solo le linee complete vengono trasmesse all'applicazione.

Per interrompere la lettura dopo un numero fisso di caratteri in modo da implementarlo read -n, bash deve passare alla modalità raw. In modalità raw, il terminale non esegue alcuna elaborazione del Backspacetasto (quando si preme Backspace, il carattere precedente è già stato inviato a bash) e neanche bash esegue alcuna elaborazione (presumibilmente perché ciò offre una maggiore flessibilità di consentire allo script di eseguire la propria elaborazione).

Puoi passare l'opzione -eper abilitare il proprio editor di linee di bash (readline, che è un vero editor di linee, non come quello estremamente grezzo del kernel). Poiché bash sta eseguendo l'edizione di riga, può interrompere la lettura una volta che ha il numero richiesto di caratteri.


9

Utilizzare read -e:

$ read -e -n 5
13acX

read -e significa che:

Readline (consultare Modifica della riga di comando ) viene utilizzato per ottenere la linea.

Quando lo fai, puoi modificare l'input in uno dei modi che faresti quando scrivi al prompt della shell normale, incluso backspace Home, e così via.


1

readè un built-in bash. (vedi type read.) Puoi trovare la documentazione con 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.

oppure puoi usare 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

Lo -eswitch abilita il supporto readline che fondamentalmente consente tutte le funzionalità disponibili al prompt della shell, inclusa la gestione del backspace.

Pertanto read -en 5dovrebbe fare quello che vuoi.


-e risolve il problema ma la modalità di readlettura del "numero di caratteri immessi" è ancora senza risposta.
Keyshov Borate,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.