web-dev-qa-db-fra.com

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

Par exemple, si je suis tail -fing un fichier ou reading entrée utilisateur, <Enter> produira ^M au lieu de mettre fin à read ou d’ajouter une nouvelle ligne à stdout. ^J fonctionne bien.

Je suis sshing 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 ^M en ^J dans zsh, mais il semble que cela ne résoudrait pas le problème racine. Quelqu'un sait ce qui pourrait causer cela?

Edit: Pour répondre à quelques questions, je suis sshing dans Ubuntu à partir d’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. Lorsque je tape Ctrl-V Enter, je reçois ^M (à la fois sous OSX et Ubuntu).

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

91
benekastah

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 d'exécuter stty sane et dites-nous si cela résout le problème.

184
hackerb9

Essayez d’exécuter stty -a pour afficher les paramètres de votre terminal. Je soupçonne que votre paramètre icrnln'est pas défini et sera affiché sous la forme -icrnl (le signe moins qu'il est désactivé) au lieu d'être activé. 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 je désactive icrnlname__, ^ M 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 "transformer les retours chariot en nouvelles lignes" et masque le programme en cours d'exécution que vous pourriez taper ^ M quand Unix voudra vraiment ^ J. Auparavant, les anciens claviers avaient une touche Entrée et Entrée distincte (Return vous faisant généralement avancer un formulaire et Entrée 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 sens.

Ajoutez la commande stty icrnl à votre .profile ou .bashrc si vous constatez qu'il s'agit bien du paramètre du problème.

30
Brandon Rhodes