Appuyer sur enter produit ^ M au lieu d’une nouvelle ligne

94

Par exemple, si je suis dans tail -fun fichier ou dans readune entrée utilisateur, <Enter>cela produira ^Mdans le terminal au lieu de terminer readou d'ajouter une nouvelle ligne à stdout. ^Jfonctionne bien.

Je suis sshentré dans le système Ubuntu, si cela compte. Cela m’arrive à la fois en zsh et en bash. Une solution avec laquelle j'ai joué consiste à remapper le dans ^Mto ^Jdans zsh, mais il semble que cela ne résoudrait pas le problème fondamental. Quelqu'un sait ce qui pourrait causer cela?

Edit: Pour répondre à quelques questions, je me sshlance dans Ubuntu sous OSX. J'utilise iTerm et zsh. J'ai également oublié de mentionner que j'utilise tmux sur la machine Ubuntu.

Edit 2: Vous avez manqué une question. Quand je tape Ctrl-V Enterje reçois ^M(à la fois sur OSX et Ubuntu).

Edit 3: Sous OSX et echo $TERMproduit Ubuntu screen-256color.

benekastah
la source
Qu'est-ce que vous utilisez pour SSH sur Ubuntu?
Tasos
Oui --- et de quel OS? Cela semble être un problème de durée.
Rmano
Qu'est-ce que vous obtenez si vous tapez Ctrl + V suivi de Entrée ? Comme vous êtes capable d’exécuter des commandes très bien, ce n’est certainement pas un problème de shell.
Adaephon
2
Un redémarrage (involontaire) de mon ordinateur OSX semble avoir résolu le problème ... Je suppose que c'est l'un de ceux-là. Si tout va bien, c'est parti pour de bon.
benekastah
Également pour moi, la seule chose qui a fonctionné a été un redémarrage, y compris l'autorisation de la NVRAM. Appuyez et maintenez enfoncées les touches Commande-Option-PR immédiatement après avoir entendu le son de démarrage pour réinitialiser également la NVRAM de OSx
jonbros

Réponses:

192

Si quelqu'un d'autre a ce problème, il s'agit probablement d'un problème de paramètre de ligne de terminal stty plutôt que d'un problème TERM. Si cela vous arrive à nouveau, essayez de courir stty saneet dites -nous si cela résout le problème.

hackerb9
la source
22
Cela fonctionne aussi sur OS X.
Patrick Berkeley
1
Travaillé pour moi (Mint 17.1).
Deleet
1
Travail sur Ubuntu Bionic
protoEvangelion
fonctionne bien sur iTerm2 sur Mojave
Rakib
a travaillé pour mon chaton sur archlinux
yukashima huksay
31

Essayez de courir stty -apour voir les paramètres de votre terminal. Je soupçonne que votre icrnlréglage n'est pas défini et sera affiché sous la forme -icrnl(le signe moins signifie qu'il est éteint) au lieu d'avoir son réglage habituel d'activation. Voici comment mon terminal est normalement configuré lorsque je me connecte:

$ stty -a
speed 38400 baud; rows 45; columns 80; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>;
eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R;
werase = ^W; lnext = ^V; flush = ^O; min = 1; 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

Et je n’ai aucun problème avec les fins de ligne: soit retour (^ M), soit entrée (^ J) mettra fin aux lignes d’entrée. Mais si j'éteins icrnl^ M, des codes apparaissent soudainement à chaque fois que je parle à un programme et que je clique sur Entrée:

$ stty -icrnl
$ read line
Line of text^M^M^M^M
$ stty -a
speed 38400 baud; rows 45; columns 80; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>;
eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R;
werase = ^W; lnext = ^V; flush = ^O; min = 1; 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

Le code icrnlsignifie "retourne les retours à la ligne dans les retours à la ligne" et cache au programme en cours d'exécution que vous pouvez taper ^ M alors qu'Unix veut vraiment ^ J. Auparavant, les anciens claviers avaient une touche Entrée et Entrée séparée (où Return vous faisait généralement avancer un formulaire et que Entrée l'avait soumis), mais aujourd'hui, nous n'avons généralement qu'une touche de fin de ligne. Ce paramètre de terminal permet donc de combiner les deux significations.

Ajoutez la stty icrnlcommande à votre .profileou .bashrcsi vous trouvez qu’il s’agit bien du paramètre qui pose problème.

Brandon Rhodes
la source