web-dev-qa-db-fra.com

Terminal Linux: la saisie des commentaires a disparu, les sauts de ligne ne sont pas affichés

De temps en temps, je dois exécuter un outil de ligne de commande (un script Python) dont la sortie semble casser mon terminal. Une fois l'exécution terminée, le retour de frappe a disparu (je peux ' t voir ce que je tape) et les sauts de ligne ne sont pas affichés. Cela se produit si le terminal est démarré à distance via PuTTY, et aussi localement lorsque vous utilisez gnome-terminal.

Par exemple, après le problème, si je tape ENTER pwd ENTER, Je m'attends à voir:

[userA@Host006 ~]$
[userA@Host006 ~]$ pwd
/home/userA
[userA@Host006 ~]$

Mais en réalité, la sortie est:

[userA@Host006 ~]$ [userA@Host006 ~]$ /home/userA
                                                             [userA@Host006 ~]$

La seule façon de le réparer est de fermer ce terminal et d'en démarrer un nouveau.

Peut-être être lié: la sortie du script contient une mise en forme basée sur le terminal (par exemple inverser le premier plan/l'arrière-plan pour mettre en surbrillance certains messages d'état). Si je décharge cette sortie dans un fichier, je peux voir des choses comme [07mSome Message Here[0m.

Avez-vous des idées sur ce que je pourrais faire pour éviter cela?

45
E.Z.

Exécutez la commande reset et votre terminal devrait être restauré ( référence ).

Ce problème se produit généralement lors du transfert de données binaires vers le terminal STDOUT qui, lorsque les codes d'échappement reçus sont traités, peut faire n'importe quoi, changer la couleur du texte, désactiver l'écho, voire changer le jeu de caractères.

La manière la plus simple d'éviter cela est de vous assurer de ne pas vider de données binaires inconnues sur le terminal, et si vous devez ensuite les convertir en hexadécimal pour vous assurer qu'elles ne modifient pas les paramètres du terminal.

97
Joshua Briefman

Pour élaborer sur réponse de Joshua Briefman , exécutant reset -c ne réinitialisera que les caractères de contrôle responsables de votre problème:

tset, reset - initialisation du terminal

Usage: tset [options] [terminal]

Options:
  -c          set control characters
  -e ch       erase character
  -I          no initialization strings
  -i ch       interrupt character
  -k ch       kill character
  -m mapping  map identifier to type
  -Q          do not output control key settings
  -r          display term on stderr
  -s          output TERM set command
  -V          print curses-version
  -w          set window-size

Notez également la forme suivante dans la commande manual :

Remarque, vous devrez peut-être taper

<LF>reset<LF>

(le caractère de saut de ligne est normalement control-J) pour que le terminal fonctionne, car le retour chariot peut ne plus fonctionner dans un état anormal. De plus, le terminal ne fait souvent pas écho à la commande.

6
Bas Peeters