Appuyer sur Entrée produit ^ M au lieu d'une nouvelle ligne

65

Par exemple, si tail -f un fichier ou read input utilisateur, <Enter> produira ^M dans le terminal au lieu de terminer read ou d'ajouter une nouvelle ligne à stdout. ^J fonctionne bien.

Je suis en train de participer au système ubuntu, si cela compte. Cela m'arrive à la fois dans zsh et bash. Une solution avec laquelle j'ai joué consiste à remapper le ssh à ^M dans zsh, mais cela semble ne pas résoudre le problème de base. Quelqu'un sait ce qui pourrait causer cela?

Edit: Pour répondre à certaines questions, je suis en train de travailler sur Ubuntu depuis OSX. J'utilise iTerm et zsh. J'ai aussi oublié de mentionner que j'utilise tmux sur la machine Ubuntu.

Modifier 2: une question manquée. Lorsque je tape ^J , j'obtiens ssh (à la fois sur OSX et Ubuntu).

Modifier 3: sous OSX et Ubuntu, Ctrl-V Enter produit ^M .

    
posée benekastah 01.04.2014 - 03:39
la source

2 réponses

134

Au cas où quelqu'un d'autre aurait ce problème, il est très probable que le paramètre stty terminal line soit un problème TERM. Si cela vous arrive encore, essayez de lancer stty sane et dites-nous si cela résout le problème.

    
réponse donnée hackerb9 22.04.2014 - 07:21
la source
28

Essayez d'exécuter stty -a pour afficher les paramètres de votre terminal. Mon soupçon est que votre paramètre icrnl n'est pas défini et sera affiché comme -icrnl (le signe moins signifie qu'il est désactivé) au lieu d'avoir son paramètre 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: retournez (^ M) ou entrez (^ J) pour terminer les lignes d’entrée. Mais si je désactive icrnl , alors ^ M codes apparaissent soudain 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 icrnl signifie "retourne les retours chariot dans les nouvelles lignes" et cache du programme en cours que vous saisissez peut-être ^ M quand Unix veut vraiment ^ J. Les anciens claviers avaient auparavant une touche Retour et Entrée distincte (où Retour vous faisait généralement passer par un formulaire et Entrez-le soumis), mais aujourd'hui, nous n'avons généralement qu'une seule clé de fin de ligne et ce paramètre aide à combiner les deux significations. p>

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

    
réponse donnée Brandon Rhodes 24.04.2014 - 19:48
la source

Lire d'autres questions sur les étiquettes