Comment résoudre le problème qu'un écran de terminal est foiré? (généralement après un redimensionnement)

76

Parfois, un écran de terminal est perturbé et lorsque nous man lslisons les pages de manuel ou que nous appuyons sur la flèche vers le haut pour accéder aux commandes précédentes de l'historique, l'écran affiche les caractères qui ne sont pas au bon endroit. (par exemple, traitez la fin d’écran comme si elle se trouvait au milieu de l’écran).

La commande resetest essayée et ça ne marchera pas. Une méthode qui fonctionne consiste à se déconnecter ou à fermer la fenêtre, puis à redimensionner la fenêtre, puis à le faire ssh(ou à fermer cet onglet et à redimensionner la fenêtre, puis ouvrir un nouvel onglet pour obtenir un nouveau shell).

Mais de cette façon, nous perdrons tout ce que nous avions fait précédemment, tel que le démarrage d’une console de machine virtuelle, etc. Ainsi, si nous ne fermons pas le shell, existe-t-il un moyen de résoudre ce problème?

(Cela s'est déjà passé juste à l'intérieur de Fedora, et aussi pour un Macbook sshdans une boîte RHEL 5.4).

Mise à jour: Je me souviens maintenant de ce qui s'est passé dans Fedora: j'ai ouvert un terminal et créé une FreeVM pour utiliser la console d'une machine virtuelle (un shell). Je pense que c'était au format 80 x 25, puis au bout d'un moment, j'ai redimensionné le terminal à environ 130 x 50, puis la "coque interne" (de la machine virtuelle) a commencé à se comporter de manière étrange).

nopole
la source
Quel émulateur de terminal utilisez-vous? Cela semble cassé si resetcela ne résout pas le problème.
Jordanie le
quel que soit le programme Terminal dans Fedora ... et le programme Terminal par défaut sous Mac OS X Lion.
nopole
S'il vous plaît voir la mise à jour ci-dessus pour savoir comment cela s'est passé à Fedora
nopole
3
L'incantation magique est ^Jreset^J, où ^Jsignifie pressant ctrl-J. Ou (sur les terminaux graphiques), vous pouvez essayer le Resetbouton. En outre, certains programmes ne sont tout simplement pas préparés à la taille des terminaux qui les modifient (oui, les logiciels antiques sont toujours d'actualité) ou tout simplement mal se comporter lorsque le terminal devient trop petit.
vonbrand
1
Mes problèmes sont dus au fait que bash a mal calculé la longueur de l’invite, car elle comportait des codes de couleur; Il me manquait les caractères d'échappement \ [et \] - voir unix.stackexchange.com/questions/105958/…
qneill

Réponses:

93

Si vous utilisez bash, vérifiez si l’option "checkwinsize" est activée dans votre session en utilisant

shopt | grep checkwinsize

Si vous n'obtenez pas

checkwinsize    on

puis l'activer avec

shopt -s checkwinsize

La documentation Bash dit pour l'attribut "checkwinsize":

"Si défini, Bash vérifie la taille de la fenêtre après chaque commande et, si nécessaire, met à jour les valeurs de LINES et COLUMNS."

Si vous aimez le réglage, vous pouvez l'activer checkwinsizedans votre ~/.bashrc.

  • Activer: shopt -s checkwinsize
  • Pour désactiver: shopt -u checkwinsize
Arcadien
la source
6
Cela n'arrive pas à résoudre mon problème, mais c'est une bonne réponse générale, donc +1 quand même. Je pense que mon problème est lié à l'émulation de Windows (?) Lorsque ssh-ing est utilisé sur un serveur Linux.
geneorama
Au début, il semblait que cela ne fonctionnait pas lorsque j'ai utilisé les flèches vers le haut pour voir l'historique, mais juste après la première commande exécutée, tout a été corrigé. Utiliser terminateur dans mon cas. Merci +1
kstenger
cela a fonctionné pour moi, mais seulement en désactivant checkwinsize. pour une raison quelconque, LINES = 24 était défini après chaque commande alors que ma fenêtre (contenant une session picocom) était beaucoup plus grande.
Michael
19

Vous pouvez essayer Ctrl+ L. Il efface et / ou redessine l'écran du terminal, en fonction du programme.

BlueBomber
la source
3
mais cela ne résout pas le problème de façon permanente ...
nopole
Je pense que je voulais dire que si vous appuyez sur CTRL L, la ligne est ok pour le moment, mais si vous éditez à nouveau la ligne (ou sur la ligne de commande suivante que vous tapez), le problème est toujours là
nopole
11

l'ajout de ces options au docker exec semblait résoudre mon problème

-e COLUMNS=$COLUMNS -e LINES=$LINES -e TERM=$TERM
Oran Agra
la source
1
Étiez-vous celui qui a posé la question il y a 5 ans?
Archemar
3
Je peux vous dire qu'il n'est pas: "docker" ne correspond pas vraiment à "il y a 5 ans". Docker n'était pas encore sorti en janvier 2013 ;-)
jplandrain
8

J'ai eu le même problème et aucune des recettes ci-dessus n'a fonctionné pour moi parce que je crois que ma bash ne reçoit jamais les SIGWINCHsignaux, qui sont piégés par son processus parent.

J'ai finalement trouvé une solution. J'ai ajouté à mon .bashrc:

export PROMPT_COMMAND="resize &>/dev/null ; $PROMPT_COMMAND"

Maintenant, chaque fois que je reçois une nouvelle invite, ma fenêtre est réajustée.

Merci à UKmonkey pour l’amélioration de PROMPT_COMMAND.

Anthony Scemama
la source
2
export PROMPT_COMMAND="resize &>/dev/null; $PROMPT_COMMAND"
Personnellement,
Je voudrais juste exécuter redimensionner manuellement en cas de besoin. Interroger la console pour la taille peut être lent. Chaque commande semble excessive et vous savez généralement quand elle a été redimensionnée.
Conrad Meyer
6

Je voulais juste ajouter à ce qu'Arcadien avait déjà mentionné. L'activation de checkwinsize fait l'affaire, mais pour moi, il était nécessaire de redéfinir la taille de la fenêtre pour qu'elle fonctionne correctement. J'imagine que le checkwinsize était censé éliminer cela, mais valait quand même le coup. Essayez simplement de changer la taille de la fenêtre ou de la minimiser et de la maximiser après avoir affiché cette option.

Saketrp
la source
1
Croyez-le ou non, c'était tout ce qu'il fallait pour que le mien soit réparé. C'est drôle parce que j'ai tout essayé en premier.
taranaki
4

Je rencontre de temps en temps le même problème en utilisant zsh sur macOS. Un simple appel de resetcommande redéfinit le terminal à mon goût.

non coupé
la source
Donc, le PO a mentionné que cela resetne fonctionnait pas pour eux, et c'était en fait le but de la question ....
Stephen Rauch Le
OP a mentionné que cela ne fonctionnait pas sur les versions de Linux. J'ai fait face à la question sur MacOS Sierra et resettravaillé dans ce cas. J'ai ajouté cette réponse pour aider tous ceux qui rencontrent le même problème sous MacOS et ne sont pas au courant des resetcommandes.
nonocut
resetfonctionne sur Windows Putty avec Ubuntu 16.04!
Musbach
reset a travaillé sur ubuntu 16.04 zsh
A.Wan
2

J'ai eu le même problème que vous et voici ce que j'ai fait:
j'ai une .profileconfiguration dans mon utilisateur, donc c'est là que je fais toutes mes modifications.

Il existe un paquet appelé xtermqui est disponible par le biais de apt-getje ne sais pas yum. Mais j’ai fait une installation locale à partir des sources car je n’ai pas de privilèges d’installation. LIEN: http://invisible-island.net/xterm/#download

./configure --prefix=/the/path/you/want/to/install/to
make
make install

J'ai exporté le chemin dans mon profil et je l'ai invoqué au même endroit

export PATH=$PATH:/the/path/you/want/to/install/to
resize

Alors maintenant, chaque fois que je me connecte, la taille du terminal est définie en conséquence par redimensionnement.

Chromatine pliée
la source
1

Eh bien, c'est un problème commun et il devrait y avoir une solution simple.

Si d'autres mesures telles que Ctrl + A Ctrl + L ne fonctionnent pas, essayez d'utiliser stty:

  1. Ctrl + T: ouvre un nouvel onglet avec un shell local.
    Ou: laissez l'écran (Ctrl + AD pour le détacher) et déconnectez-vous de votre session SSH.
  2. stty -a | grep rows: Obtenir le nombre de lignes et de colonnes.
    Exemple:speed 38400 baud; rows 33; columns 133; line = 0;
  3. Retournez à votre onglet distant ou connectez-vous et reconnectez l'écran. La sttysortie devrait être différente.
    Exemple:speed 38400 baud; rows 47; columns 177; line = 0;
  4. Tapez dans stty rows Net stty columns Noù N est le nombre "réel" (en dehors de l'écran). Exemple:$ stty rows 33; stty columns 133

Si vous utilisez Terminator , vous pouvez ignorer les trois premières étapes car elles indiquent le nombre de colonnes et de lignes en haut.

Il n'est pas nécessaire de redimensionner les fenêtres de votre terminal pour y faire face. Les administrateurs se connectent généralement à partir de différents ordinateurs. Lorsque la taille (résolution) des moniteurs connectés est différente, une fenêtre agrandie a une taille différente sur chaque ordinateur. En fait, il est plutôt difficile de ne pas tomber aussi souvent dans cette situation.

Et le résultat n'est pas simplement que certaines pages de manuel ne s'affichent pas correctement. C'est à peu près tout ce qui utilise un téléavertisseur - les premières lignes manquent souvent (par exemple). Et ne pensez même pas à utiliser VIM dans un terminal aussi mal aligné. Vous souhaitez mettre la ligne 3 (V) en surbrillance pour la remplacer, mais lorsque vous le faites, le texte en surbrillance est celui d’une autre ligne.

basic6
la source
CentOS ne semble pas avoir de redimensionnement - utilisez "stty rows 66" pour faire l'affaire.
Russ
0

Essayez stty sane. il devrait faire ce dont vous avez besoin.

phil294
la source