Le retour arrière ne fonctionne pas dans le script bash en cours d'exécution

8

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 backspacecaractère, il s'imprime ^?au lieu de supprimer le caractère. Et quand j'appuie sur Ctrl+ backspacela sortie est ^H. Comment ce comportement pourrait-il être corrigé afin de backspacesupprimer le caractère au lieu d'ajouter ces caractères? J'ai essayé la stty erase '^?'commande mais sans succès.

vrom911
la source
Veuillez noter que 16.10 a atteint la fin de son cycle de support le mois dernier. Vous devriez passer à la version 17.04 dès que possible.
Byte Commander
1
Je suggère de remplacer read CMDpar read -e CMD.
Cyrus
1
essayez terminatorau lieu de gnome-terminal. Son fonctionnement comme prévu
Severus Tux
1
@whtyger cela a fonctionné pour ce script. Dans ma situation réelle, j'ai une entrée du programme, qui n'appelle pas lecture. Je n'ai aucune possibilité de changer le script du programme, ce n'était qu'un exemple qui représentait mon problème. Y a-t-il des paramètres globaux où je peux faire effectuer ces configurations pour toutes les entrées?
vrom911
1
@Cyrus My Backspace fonctionne comme je veux - il supprime toujours le dernier caractère, même pour ce script de la question sans -eoption. 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é.
Shersh

Réponses:

6

Le problème est qu'il existe de nombreuses façons de représenter un retour arrière, mais la readcommande 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-terminalcomme émulateur, ouvrez le manuel Edit et cliquez sur Préférences de profil . Basculez vers l' onglet Compatibilité et vous devriez obtenir ces options:

gnome-terminal → préférences de profil → compatibilité

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:

  • Automatique (fonctionne)
  • Control-H (imprime à la ^Hplace)
  • ASCII DEL (par défaut, fonctionne)
  • Séquence d'échappement (imprime à la ^[[3~place)
  • TTY Erase (fonctionne)
Byte Commander
la source
Actuellement, j'ai ASCII DEL. J'ai essayé les 5 options mais aucune n'a résolu le problème.
vrom911
C'est étrange. Pouvez-vous me dire ce que type readdit et quels $SHELL --versionrapports shell / version ?
Byte Commander
Je sais que c'est étrange. J'ai beaucoup essayé de rechercher mon problème sur Google, mais je n'ai pas trouvé de solution qui me convient. type readdit read is a shell builtin. et $SHELL --versionditGNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
vrom911
1

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 backspacecaractère s'imprime (revient en écho à l'écran) ^?au lieu de supprimer le dernier caractère.

Utilisez # stty icanonpour autoriser le "mode canonique (cuit)". Voir quelques explications ici /unix/131105/how-to-read-over-4k-input-without-new-lines-on-a-terminal

Un 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 -icanonde désactiver la limite 4k, mais j'ai perdu la possibilité d'utiliser le retour arrière (effacement).

Roger
la source