Comment gérer le retour arrière pendant la lecture?

10

Comment gérer les backspaces entrés, cela montre ^?si essayé et comment readcompte les caractères, car 12^?3déjà 5 caractères étaient complets (bien que tous ne soient pas réellement entrés), mais après 12^?3^?avoir renvoyé l'invite, bizarre. Aidez-moi!

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

Réponses:

10

Lorsque vous lisez une ligne entière avec plain read(ou d' read -rautres options qui n'affectent pas ce comportement), l'éditeur de ligne fourni par le noyau reconnaît la Backspaceclé pour effacer un caractère, ainsi que très peu d'autres commandes (y compris Returnpour terminer l'entrée ligne et l'envoyer). Les touches de raccourci peuvent être configurées avec l' sttyutilitaire. Le terminal est dit en mode cuit lorsque son éditeur de ligne est actif. En mode brut, chaque caractère tapé sur le clavier est immédiatement transmis à l'application. En mode cuit, les caractères sont stockés dans un tampon et seules les lignes complètes sont transmises à l'application.

Pour arrêter la lecture après un nombre fixe de caractères afin de l'implémenter read -n, bash doit passer en mode brut. En mode brut, le terminal ne fait aucun traitement de la Backspacetouche (au moment où vous appuyez Backspace, le caractère précédent a déjà été envoyé à bash), et bash ne fait aucun traitement non plus (probablement parce que cela donne la plus grande flexibilité de permettre au script de faire son propre traitement).

Vous pouvez passer l'option -epour activer le propre éditeur de ligne de bash (readline, qui est un bon éditeur de ligne, pas comme celui extrêmement brut du noyau). Puisque bash fait l'édition en ligne, il peut arrêter la lecture une fois qu'il a le nombre de caractères demandé.

Gilles 'SO- arrête d'être méchant'
la source
9

Utilisation read -e:

$ read -e -n 5
13acX

read -e signifie que:

La ligne de lecture (voir Modification de la ligne de commande ) est utilisée pour obtenir la ligne.

Lorsque vous faites cela, vous pouvez modifier l'entrée de l'une des manières que vous auriez lors de l'écriture à l'invite du shell standard, y compris le retour arrière, Homeetc.

Michael Homer
la source
1

readest un bash intégré. (voir type read.) Vous pouvez trouver de la documentation avec 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.

ou vous pouvez utiliser 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

Le -ecommutateur active la prise en charge de la ligne de lecture qui permet essentiellement toutes les fonctionnalités disponibles à l'invite du shell, y compris la gestion du retour arrière.

read -en 5Vous devez donc faire ce que vous voulez.

michas
la source
-e résout le problème mais la façon dont readle «nombre de caractères saisis» est toujours sans réponse.
Keyshov Borate