J'exécute un script très simple qui lit ligne par ligne et imprime la ligne saisie sur le terminal:
while read CMD; do
echo $CMD
done
Cela fonctionne bien, mais lorsque j'essaie de modifier la ligne avec le backspace
caractère, il s'imprime ^?
au lieu de supprimer le caractère. Et quand j'appuie sur Ctrl
+ backspace
la sortie est ^H
. Comment ce comportement pourrait-il être corrigé afin de backspace
supprimer le caractère au lieu d'ajouter ces caractères? J'ai essayé la stty erase '^?'
commande mais sans succès.
command-line
bash
vrom911
la source
la source
read CMD
parread -e CMD
.terminator
au lieu degnome-terminal
. Son fonctionnement comme prévu-e
option. Mais sur la machine de @ vrom911, ce n'est pas le cas. Je me demande pourquoi cela se produit et où cela peut être configuré.Réponses:
Le problème est qu'il existe de nombreuses façons de représenter un retour arrière, mais la
read
commande ne les comprend pas toutes. Vous devriez être en mesure de configurer exactement ce qui est envoyé lorsque vous appuyez sur la ← Backspacetouche dans les paramètres de votre émulateur de terminal.En supposant que vous utilisez
gnome-terminal
comme émulateur, ouvrez le manuel Edit et cliquez sur Préférences de profil . Basculez vers l' onglet Compatibilité et vous devriez obtenir ces options:Vous pouvez maintenant modifier la clé de retour arrière qui génère: le paramètre. Vous avez le choix entre ces cinq options ci-dessous. J'ai ajouté entre accolades comment ils se comportent sur mon système:
^H
place)^[[3~
place)la source
type read
dit et quels$SHELL --version
rapports shell / version ?type read
ditread is a shell builtin
. et$SHELL --version
ditGNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
J'ai eu le même problème en utilisant bash dans Gnome-Terminal.
Notez que sur la ligne de commande, le retour arrière fonctionne comme prévu, mais lorsque mon programme (un simple client de chat basé sur un socket TCP) lit depuis stdin, le
backspace
caractère s'imprime (revient en écho à l'écran)^?
au lieu de supprimer le dernier caractère.Utilisez
# stty icanon
pour autoriser le "mode canonique (cuit)". Voir quelques explications ici /unix/131105/how-to-read-over-4k-input-without-new-lines-on-a-terminalUn peu plus de contexte à mon problème / solution: j'ai eu un problème où je dois coller plus de 4k caractères. Et pendant cette recherche, j'ai été amené au lien ci-dessus. J'avais l'habitude
# stty -icanon
de désactiver la limite 4k, mais j'ai perdu la possibilité d'utiliser le retour arrière (effacement).la source