91 votes

Shell ne montre pas les commandes tapées, "reset" fonctionne, mais que s'est-il passé ?

Mon problème est que le Shell de Bash n'affiche plus les caractères que je tape dedans. Il lit cependant les commandes.

J'ai rencontré ce problème à plusieurs reprises et je n'en comprends pas la cause. Je sais comment le résoudre, mais je n'aime vraiment pas quand je dois faire du "vaudou" pour me sortir des problèmes.

Je vais décrire les deux façons dont j'ai rencontré ce problème :

J'exécute un certain processus, http://pythonpaste.org/script/ et parfois quand j'arrête ça ou que ça casse le contrôle est rendu au Shell. Quand je vais ensuite taper des commandes dans le Shell, les caractères que je tape ne s'affichent pas. Lorsque j'appuie sur entrée, les commandes sont soumis. Ainsi, par exemple :

  • Je tape "ls"
  • Je ne vois qu'une invite vide et rien de plus
  • J'appuie sur la touche "Entrée" et j'obtiens une liste des fichiers, autrement dit : la commande est exécuté
  • quand je donne la commande "reset", le Shell recommence à fonctionner normalement.

La deuxième façon dont cela se produit est lorsque je donne une commande comme celle-ci :

$ grep foo * -l | xargs vim

J'utilise grep pour trouver les fichiers qui ont un certain modèle et je veux ensuite ouvrir tous les fichiers qui résultent du grep. Cela fonctionne comme un charme (bien que pas aussi rapidement que je l'avais espéré). Mais lorsque je quitte Vim, mon Shell cesse d'afficher les caractères que je tape dedans. Une commande de réinitialisation résout le problème.

Je pense que les deux problèmes ont une raison sous-jacente, mais je ne sais pas comment ni quelle est cette raison.

La recherche de ce problème est elle-même problématique car la description est assez vague et ne comporte pas de termes de recherche précis.

Modifier

Donner le

stty --all

conformément à la demande de John S. Gruber a donné le résultat suivant (les espaces ont été modifiés pour faciliter la lecture)

speed 0 baud;
rows 53;
columns 186;
line = 0;
intr = <undef>;
quit = <undef>;
erase = <undef>;
kill = <undef>; 
eof = <undef>;
eol = <undef>; 
eol2 = <undef>; 
swtch = <undef>; 
start = <undef>; 
stop = <undef>; 
susp = <undef>;
rprnt = <undef>; 
werase = <undef>; 
lnext = <undef>; 
flush = <undef>; 
min = 0; 
time = 0;
-parenb 
-parodd cs8 
-hupcl 
-cstopb cread 
-clocal 
-crtscts
-ignbrk 
-brkint 
-ignpar 
-parmrk 
-inpck 
-istrip 
-inlcr 
-igncr 
-icrnl 
-ixon 
-ixoff 
-iuclc 
-ixany 
-imaxbel 
-iutf8
-opost 
-olcuc 
-ocrnl 
-onlcr 
-onocr 
-onlret 
-ofill 
-ofdel nl0 cr0 tab0 bs0 vt0 ff0
-isig 
-icanon 
-iexten 
-echo 
-echoe 
-echok 
-echonl 
-noflsh 
-xcase 
-tostop 
-echoprt 
-echoctl 
-echoke

95voto

John S Gruber Points 12997

Lors de l'exécution d'un Shell ou de la plupart des programmes dans un Shell, tout ce que vous tapez est renvoyé en écho au terminal de l'utilisateur par le sous-système tty du noyau. Il y a d'autres manipulations spéciales, aussi, pour les caractères d'effacement, Ctrl+R , Ctrl+Z et ainsi de suite.

Certains programmes, (les éditeurs en particulier) qui s'exécutent à partir d'une ligne de commande n'ont pas besoin ou ne veulent pas de cela. Pour cette raison, ils signalent au noyau par un message Appel IOCTL contre le périphérique tty (terminal) qu'ils ne veulent pas de ce comportement. Ils ne veulent pas non plus que les caractères spéciaux fassent des choses spéciales. Au lieu de cela, ils demandent au noyau un mode "brut". En particulier, les éditeurs comme vim désactivent divers "paramètres d'écho". Tout ceci s'applique aux terminaux tty réels sur les lignes série d'un ordinateur, ou aux terminaux virtuels à l'adresse suivante Alt+Ctrl+F4 ou les terminaux vraiment virtuels que vous obtenez lorsque vous exécutez quelque chose comme gnome-terminal sous une interface graphique.

De tels programmes sont censés réinitialiser tous les modes qu'ils modifient sur le tty virtuel qu'ils utilisent avant de quitter, soit en entrant une commande de l'éditeur quit ou en prenant un signal (de Ctrl+C ) par exemple.

S'ils ne le font pas correctement, le tty reste dans l'état bizarre que vous avez découvert. Puisque les programmes peuvent échouer à réinitialiser le terminal, la fonction reset La commande a été écrite pour permettre à l'utilisateur de récupérer.

Je suppose que l'interruption perturbe le logiciel Python que vous exécutez. Je suppose que ce programme n'a pas la possibilité de réinitialiser le terminal, ou qu'il ne le fait tout simplement pas.

Dans le cas de vim, lorsque j'exécute votre exemple, j'obtiens le même comportement que celui que vous décrivez. Je vois également un message "Vim : Warning : Input is not from a terminal" (Il disparaît quand on réinitialise). C'est parce que vim n'est pas lancé normalement à partir du Shell. Au lieu de cela, le programme ' grep et xargs Les commandes ' ont utilisé l'entrée standard, normalement occupée par le tty, pour transmettre les noms de fichiers de l'application grep tto xargs .

Dans votre sortie affichée de stty -a on peut voir "-echo", confirmant également que c'est le problème. Si vous deviez tuer vim de manière à ce qu'il ne puisse pas gérer le signal avec élégance, vous verriez probablement le même problème.

Le problème est décrit ailleurs à l'adresse suivante https://stackoverflow.com/questions/3852616/xargs-with-command-that-open-editor-leaves-Shell-en-état de délire .

Une solution pour le cas de vim est d'éviter xargs et d'utiliser à la place :

vim $(grep foo * -l)

Ici la liste des fichiers est construite par le Shell, comme elle l'avait été par xargs, mais le Shell appelle vim, qui est directement connecté au tty. Il y a un message d'avertissement envoyé au fichier de sortie des erreurs, et vim définit et réinitialise les paramètres du tty correctement.

Une alternative à reset qui n'efface pas l'écran est stty sane .

Plus de références aquí et un autre intéressant aquí . Une autre solution intéressante est donnée dans une réponse à https://stackoverflow.com/questions/8228831/why-does-locate-filename-xargs-vim-cause-strange-terminal-behaviour .

15voto

Gabriel Staples Points 5149

TLDR ; exécutez ceci dans le terminal qui ne montrera plus les commandes que vous tapez :

reset

Votre terminal sera effacé et réinitialisé, et vous pourrez à nouveau voir les commandes tapées. Notez que lorsque vous tapez reset ci-dessus, vous ne pourrez rien voir, il peut donc être utile d'appuyer sur Ctrl + C avant de taper reset pour effacer toutes les commandes existantes ou les caractères parasites avant d'exécuter la commande reset.

Longue réponse de quelqu'un d'autre : Shell ne montre pas les commandes tapées, "reset" fonctionne, mais que s'est-il passé ?

11voto

xxx Points 504

stty sane pour que votre terminal redevienne "sain".

pour réactiver l'écho des caractères d'entrée, y compris les caractères spéciaux comme l'espacement arrière.

par rapport à reset il préserve l'historique et le retour en arrière de votre terminal.

0voto

Carra Points 6832

Je créerais un nouvel utilisateur sur le système (je veux dire un nouvel utilisateur propre et je m'y connecterais), et je verrais si le problème est là. Si ce n'est pas le cas, alors c'est soit votre terminal, soit vos paramètres X11.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X