Konsol giriş ekranındaki yukarı ok düğmesine bastığımda ^ [[A] almamın bir nedeni var mı?


32

Ne zaman konsol oturumunda olsam up, önceden yazılan komutları görmek için kasten oka basıyorum. Ama bunu görüyorum ^[[A.

Ancak Ctrl Alt Print Screen Scroll Lock Pause Break Page Up Page Down Wintuşlara bastığımda hiçbir karakter yankılanmıyor.

Bunun sebebi ne olabilir?

Does ^[[Akarakterler şey ima tür?

görüntü tanımını buraya girin

Yanıtlar:


20

Terminal, klavyeden kendisine gönderilen Yukarı tuşunun ham tuş kodunu temsil etme şeklidir. Temel olarak, kabuğunuz normalde tuşa basar, ancak oturum açma isteminde bunu yapacak hiçbir şey yoktur. Böylece yazdığınız karakter, diğer herhangi bir harf (veya sayı veya her neyse) gibi konsola yazdırılır.


3
@RubanSavvy Ctrl, Alt ve Win (genellikle GNU / Linux dünyasında Süper olarak adlandırılır) değiştiricilerdir. Onlara ve bir tuşa basarsanız, ekranda yazılı farklı bir şey görürsünüz. Şüphelendiğim kaydırma kilidi, emin olmasam da, çekirdek kontrolü ya da düşük seviye bir şey tarafından yorumlanıyor, ancak tty kontrolü için yorumlanıyor. Sayfa yukarı ve aşağı neden gettyveya loginemin değilim, ancak neden emin değilim. Eğitimli tahminler, baskı ekranının çekirdek tarafından özellikle tarihi nedenlerle yorumlandığını söylüyor. Yine de, modifiye ediciler hariç hiçbirinde% 100 emin değilim.
Strugee

3
Yukarıdakiler muhtemelen cevap olarak düzenlenmelidir.
Strugee


19

Klavyeler bilgisayara olayları gönderir. Bir olay “tarama kodu nnn aşağı” veya “tarama kodu nnn yukarı” diyor. Zincirin diğer ucunda, bir terminalde çalışan uygulamalar karakter dizisi şeklinde girdi bekler. (X sunucusu gibi, ham erişim istemedikleri sürece.) Düğmesine bastığınızda A, klavye “tarama kodu 38 aşağı” bilgisini gönderir. Konsol sürücüsü tuş eşlemesini arar ve bunu “karakter a” e dönüştürür (değiştirici tuşa basılmazsa).

Bir karaktere neden olmayan bir tuşa veya tuş bileşimine bastığınızda, bilgilerin karakterler açısından kodlanması gerekir. Birkaç tuş ve tuş birleşimi karşılık gelen kontrol karakterlerine sahiptir, örneğin Ctrl+ + Akarakteri gönderir (bayt değeri 1), Returnkarakteri gönderir (Ctrl + M, bayt değeri 13), vb. (escape, byte value 27) karakteriyle başlayan bir karakter dizisi . Örneğin, anahtar Upkaçış sırasına çevrilir ␛[A(üç karakter: kaçış, açık parantez, büyük harf A).

Konsoldaki kullanıcı adı istemi aptal ve kaçış dizilerinin çoğunu anlamıyor. Alıştığınız hat sürümü ve geçmiş özelliklerine sahip değildir: bunlar kabuk tarafından sağlanır ve oturum açana kadar bir kabuğunuz yoktur. Bu yüzden sadece kaçış dizisini gösterir. Karakter için glif yok , bu nedenle olarak görüntüleniyor ^[. Bu ^işaret geleneksel olarak kontrol karakterleri için ön ek olarak kullanılır ve kaçış ^[bayt değeri nedeniyledir: [eksi 64 bayt değeridir .

UpBir kabuk isteminde tuşuna basarsanız , bu aynı 3 karakter dizisini kabuğunuza gönderir. Kabuk bunu bir komut dizisi olarak yorumlar (tipik olarak önceki geçmiş öğesini çağırmak için). Eğer basarsanız Ctrl+ Vardından Upbir kabuk en istemi, bu ekler istemi de çıkış sırası: Ctrl+ Vböylece bir komut olarak yorumlama anlamıyla yerine gelecek karakteri eklemek için bir komut olduğu karakter bir kaçış dizisinin başlangıcı olarak yorumlanmaz .

Bazı anahtarlar sadece değiştiricilerdir ve terminal uygulamalarına aktarılmazlar. Örneğin, tuşuna bastığınızda Shift, bu bilgiler terminal sürücüsünde kalır ve tuşuna basarsanız hesaba katılır A, böylece sürücü Ayerine uygulamaya gönderir a.

Ayrıca, bazı fonksiyon tuşları konsolunuzda eşlenmemiş olabilir.

GUI'deki benzer bir görünüm için bkz. Bash'in meta anahtarı nedir?


Bu harika bir cevap, teşekkürler her zaman olduğu gibi Gilles.
JoshuaRLi

5

Anahtarların "terminal" (yani terminal emülatör uygulaması) ile nasıl temsil edildiği ile ilgili değildir. Gördüğünüz şey, bir satır yukarı gitmek için ANSI kodu ( ANSI kaçış dizisi ), ancak yazdırılabilir forma çevrilmiş.

  1. Klavye donanımı "tarama kodları" gönderir, ancak bunlar komut satırı seviyesindeki uygulamalara karakter olarak çevrilir ve sunulur. Tuş Atek bir bayt olur: AShift tuşu basılıysa (veya Shift Lock) adeğilse.

  2. ANSI uyumlu terminale olarak, ok tuşları tek bir karakterin (ASCII karakter kümesinde oklar için hiçbir kodlar vardır), ama bir 3 karakterli "kaçış dizisi" gönderme: escape-[-A. Diğer üç ok tuşu escape-[-B, C, D.

  3. Aynı karakter dizisi, imleci eski bir fiziksel ANSI terminaline gönderilirse (yankılanırsa) bir satır yukarı taşır. Terminal emülatörleri dahil olmak üzere pek çok program bu karakter dizilerini tanır ve uygun bir şey yapar: terminal emülatörleri imleci yukarı doğru hareket ettirir (bu şekilde curseskütüphanenin imleci hareket ettirdiği yoldur), ancak bashbunun yerine geçip geçmişi kaydırır.

  4. İmleci ekranın etrafında hareket ettirmek için kullanmayan programlarda imlecin her yere dağılmasını önlemek için, ESC'yi basılabilir sıra olarak görüntülenen klavye girişinde göreceksiniz. ^[ (çünkü kaçış karşılık gelir control-[). Bu aslında terminal cihazı arayüzü tarafından ele alınmaktadır; bkz stty(1). Sonuç olarak, yukarı ok olarak görünecektir ^[[A. Bunu yazarsanız, komut satırından görürsünüz cat, return tuşuna basın ve bazı ok tuşlarına basın. Bu aynı zamanda konsol giriş ekranında gördüğünüz şeydir.

Son olarak: Control,Alt ve karakter dizileri eşleşmeyebileceğinden bahsedilen diğer tuşları. Başka bir tuşa basılarak gönderilen karakteri etkiler ( yukarıdaki a/ Aörnekte olduğu gibi) veya metne eşleme yapmıyorlar. Bu tuşlara yalnızca klavye olaylarını dinleyen programlar tarafından tespit edilebilir. Standart girdiden okuyarak görülemezler (veya bir dosyaya yazılabilirler).


3

Bu davranış kabuğundan kabuğa farklıdır. Çoğu kabuk readline, istemdeki satırları düzenlemek için adlandırılan bir kütüphane kullanır .İşte bu kütüphane için tam bir komut referansıdır, bir uygulama kullanırken readlinebu komutları kullanarak satırları düzenleyebilir ve gezinebilirsiniz.

Dikey ok tuşları, komut geçmişinde gezinmek için readline'da yapılandırılmıştır. Ve oturum açma promosyonunda komut geçmişi yok. Bu yüzden karakterler ^[[Ave^[[B ekranda basılır. Öyleyse ne ^[[Ademek istiyorsun?

Bash el ile sayfa altında diyor PROMPTING:

\[     begin a sequence of non-printing characters, which could be used to embed
       a terminal control sequence into the prompt

Kaçış dizileri ANSI ok tuşları için şunlardır:

  • [ValueA İmleç yukarı (nerede Value emtpy olabilir)

  • [ValueBİmleç aşağı (nerede Valueemtpy olabilir)


5
Cevabınız farklı bir şeydir, çünkü giriş istemi loginilgili olmayan bir kişi tarafından basılır ve kullanılır bash.
Risto Salminen

1
bashve loginsatırları düzenlemek için aynı kütüphaneyi (okuma satırı) kullanıyorlar. Aradaki fark, logindikey ok tuşlarını komut gibi yorumlamamaktır bash.
Kaos

Evet, itiraf ediyorum.
Risto Salminen

Bash sözdizimi, ^[temsili gibi görünmek içindir escape, fakat onlar farklı şeylerdir. Bash herhangi bir sözdizimi kullanabilirdi. Aslında, yazarken \[Abash üç karakter verir: ^[(yani kaçış) [,, A.
alexis

0

Bunlar ANSI kaçış kodları . ^[Kabuğunuzun bir ESCbayt (ASCII bayt 27) görüntülemek için kullandığı gösterimdir . Yani örneğiniz bir ESC baytı ve ardından metin [A. Vikipedi makalesinde görebileceğiniz gibi ^[[( ESCardından gelen [) bir Kontrol Dizisi Sunucusu veya CSI'dır. CSI Aimleci bir sütun kadar yukarı hareket ettirmek anlamına gelir.

Terminalde bir çıkış kodu görmek istiyorsanız, CTRL + V ve sonra başka bir tuş sırası yazın. Örneğin, CTRL + V ve ardından yukarı ok gösterir ^[[A.


0

Komut kabuğu, örneğin Bash, yukarı ok komutunu "önceki komutu al" eylemine çeviren programdır. Çalışan bir komut kabuğunuz yok.


0

TLDR

Muhtemelen koşuyorsun sh , Yukarı ok tuşuna bastığınızda oluşturulan ham anahtar kodlarını çıkaran .

Gibi daha gelişmiş bir kabuk, bashbu anahtar kodları engeller ve onlarla bir şeyler yapar. Örneğin tarihinin son komutunu göster.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.