Pour réinitialiser le terminal, un simple reset
va résoudre ce problème. Pour plus d'informations et d'options, man reset
La réponse de @James Henstridge à cette question AskUbuntu semble identifier correctement l'erreur car le terminal reste bloqué dans un mode "d'adressage du curseur", quoi que cela signifie.
Sa première solution, la commande $ tput rmcup
, fonctionne, bien qu'il n'y ait pas beaucoup d'explications. J'ai donc essayé de comprendre cela.
man tput
nous dit que
Le
tput
l'utilitaire utilise leterminfo
base de données pour rendre les valeurs des capacités et des informations dépendant du terminal disponibles pour le shell (voir sh(1)), pour initialiser ou réinitialiser le terminal, ou renvoyer le nom long du type de terminal demandé.
terminfo
n'est pas non plus très utilement documenté. La source la plus complète que je puisse trouver est un article de tldp.org. Évidemment terminfo
est une base de données de différents terminaux et des commandes et capacités dont ils disposent. Vraisemblablement, chaque installation Linux en a un? Vous pouvez donc utiliser différents terminaux ?
man terminfo
indique que ses fichiers sont en /etc/terminfo/*/*
, mais sur Ubuntu 16.04, je n'y ai trouvé qu'un fichier README. Les vrais fichiers sont en /lib/terminfo/*/*
; par exemple. /lib/terminfo/l/linux
, qui est probablement le fichier le plus pertinent pour la plupart des lecteurs ? Je ne peux pas le dire, car ces fichiers ne sont pas lisibles par l'homme. L'article tldp.org lié ci-dessus indique que infocmp
peut être utilisé pour voir leur source, mais ce n'est pas vrai :
$ infocmp /lib/terminfo/l/linux
infocmp: couldn't open terminfo file /lib/terminfo/l/linux.
L'article mentionne également les fichiers de code source /etc/termcap
et /etc/terminfo.src
, mais ceux-ci n'existent pas dans Ubuntu 16.04. J'ai trouvé un ensemble de /usr/share/vte/termcap*/
répertoires contenant xterm
lisible par l'homme des dossiers. Je dois deviner que tout cela se connecte au terminal GNOME que j'utilise, c'est-à-dire Ubuntu par défaut, mais j'en ai assez d'essayer de comprendre comment.
Le man
page pour terminfo
a une autre note utile, cependant. Sous ses 'capacités prédéfinies' se trouve une 'chaîne variable' exit_ca_mode
avec 'capname' ("nom de la capacité", je suppose) rmcup
avec la description strings to end programs using cup
. La description n'est pas très utile, mais le nom de la variable l'est; cela doit faire référence à la capacité d'un terminal à quitter le "mode d'adressage du curseur", dans lequel le terminal est bloqué.
Donc, $ tput rmcup
doit utiliser tput
pour accéder au terminfo
base de données et activer le exit_ca_mode
du terminal courant capacité rmcup
, qui tue le mode d'adressage du curseur et ramène le terminal à son comportement de défilement normal.