Enter'a basmak yeni satır yerine ^ M üretir

65

Örneğin, tail -f bir dosya veya read kullanıcı girdisi% 'sindeyim, <Enter> ' si ^M 'yi sonlandırmak veya stdout'a yeni bir satır eklemek yerine terminalde read üretecektir. ^J iyi çalışıyor.

Eğer önemli ise, ubuntu sistemine%% co_de aşıyorum. Bu bana hem zsh hem de bash'ta olur. Oynattığım bir çözüm, ssh 'sının ^M ' sini zsh olarak değiştiriyor, ancak bu, kök sorununu düzeltmeyecek gibi görünüyor. Buna neyin neden olabileceğini bilen var mı?

Düzenleme: Bazı soruları yanıtlamak için,% OS_'den Ubuntu'ya% co_de girdim. İTerm ve zsh kullanıyorum. Ubuntu makinesinde tmux kullandığımı da söylemeyi unuttum.

Düzenle 2: Bir soru kaçırdı. % Co_de% yazdığımda ^J (hem OSX hem de Ubuntu'da) alırım.

Düzenleme 3: OSX'de ve Ubuntu ssh Ctrl-V Enter üretir.

    
sordu benekastah 01.04.2014 03:39

2 cevap

137

Başka birinin bu sorunu olması durumunda, büyük olasılıkla TERM sorunundan ziyade stty terminal hattı ayarında bir problemdir. Bu tekrar size olursa, stty sane dosyasını çalıştırmayı deneyin ve bu düzeltmenin yapılıp yapılmadığını bize bildirin.

    
verilen cevap hackerb9 22.04.2014 07:21
29

Terminal ayarlarınızı görüntülemek için stty -a çalıştırmayı deneyin. Şüphelerim, icrnl ayarınızın ayarlanmamış olması ve normal açık kalma ayarına sahip olmak yerine -icrnl (eksi işareti kapalı olduğu anlamına gelir) olarak gösterilmesidir. Oturum açtığımda terminalim normalde şöyle ayarlandı:

$ 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

Ve ben satır sonları ile hiçbir sorunum yok: ya dönüş (^ M) veya girin (^ J) giriş satırları bitecek. Ancak icrnl 'sini kapatırsam ve her defasında bir programla konuştuğumda ve enter tuşuna bastığımda ^ M kodları görünür:

$ 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

icrnl kodu, "satırbaşı satırlarını satırsonlarına döndür" anlamına gelir ve Unix'in gerçekten istediği ^ J yazdığı sırada ^ M yazmış olabileceğiniz çalışan programdan gizlenir. Eski klavyeler ayrı bir İade ve Girme anahtarına sahipti (Dönüş genellikle bir formdan ilerlediğinde ve Gönderiyi gönderdiğinde), ancak bugün genellikle tek bir satır sonu anahtarımız var ve bu nedenle bu terminal ayarı iki anlamın birleştirilmesine yardımcı oluyor.

Bunun gerçekten sorun ayarını bulduğunuzda stty icrnl komutunu .profile veya .bashrc değerine ekleyin.

    
verilen cevap Brandon Rhodes 24.04.2014 19:48

Etiketlerdeki diğer soruları oku