Apakah ada alasan mengapa saya mendapatkan ^ [[A ketika saya menekan panah di layar login konsol?

32

Setiap kali saya berada di login konsol, saya menekan uppanah dengan sengaja untuk melihat perintah yang diketik sebelumnya. Tapi saya melihat ini ^[[A.

Tetapi ketika saya menekan Ctrl Alt Print Screen Scroll Lock Pause Break Page Up Page Down Wintombol tidak menggemakan karakter apa pun.

Apa yang mungkin menjadi alasan di balik ini?

Apakah ^[[Asemacam karakter menyiratkan sesuatu?

masukkan deskripsi gambar di sini

Ruban Savvy
sumber

Jawaban:

20

Begitulah terminal mewakili kode kunci mentah dari tombol Atas yang dikirimkan oleh keyboard. Pada dasarnya, shell Anda biasanya akan mencegat penekanan tombol, tetapi tidak ada yang bisa dilakukan di prompt login. Jadi karakter yang Anda ketikkan akan dicetak ke konsol sama seperti huruf lainnya (atau nomor, atau apa pun).

strugee
sumber
3
@RubanSavvy Ctrl, Alt dan Win (sering disebut Super di dunia GNU / Linux) adalah pengubah. Jika Anda menekannya dan tombol, Anda akan melihat sesuatu yang berbeda dicetak di layar. Gulir kunci Saya menduga ditafsirkan oleh kernel atau sesuatu yang lain tingkat rendah, untuk kontrol tty, meskipun saya tidak yakin. Halaman naik dan turun mungkin ditelan oleh gettyatau login, meskipun saya tidak yakin mengapa. Tebakan terdidik mengatakan bahwa layar cetak ditafsirkan secara khusus oleh kernel untuk alasan historis. Saya tidak 100% yakin tentang apa pun, kecuali, pengubah.
strugee
3
jawaban di atas mungkin harus diedit menjadi jawabannya.
strugee
diskusi terkait dalam obrolan: chat.stackexchange.com/transcript/message/12481097#12481097
strugee
19

Keyboard mengirim acara ke komputer. Suatu acara mengatakan "memindai kode nnn turun" atau "memindai kode nnn ke atas". Di ujung rantai, aplikasi yang berjalan di terminal mengharapkan input dalam bentuk urutan karakter. (Kecuali jika mereka meminta akses mentah, seperti yang dilakukan server X.) Saat Anda menekan A, keyboard mengirim informasi "pindai kode 38". Driver konsol mencari keymap dan mengubahnya menjadi "karakter a" (jika tidak ada tombol pengubah ditekan).

Saat Anda menekan tombol atau kombinasi tombol yang tidak menghasilkan karakter, informasi perlu dikodekan dalam bentuk karakter. Beberapa tombol dan kombinasi tombol memiliki karakter kontrol yang sesuai, misalnya Ctrl+ Amengirim karakter (nilai byte 1), Returnmengirim karakter (Ctrl + M, nilai byte 13), dll. Sebagian besar tombol fungsi tidak memiliki karakter yang sesuai dan alih-alih mengirim urutan karakter yang dimulai dengan karakter (escape, byte value 27). Misalnya, kunci Upditerjemahkan ke dalam urutan escape ␛[A(tiga karakter: escape, open bracket, capital A).

Prompt nama pengguna pada konsol itu bodoh dan tidak mengerti sebagian besar urutan pelarian. Ini tidak memiliki edisi garis dan fitur riwayat yang biasa Anda gunakan: yang disediakan oleh shell, dan sampai Anda masuk, Anda tidak memiliki shell. Jadi itu hanya menampilkan urutan pelarian. Tidak ada mesin terbang untuk karakter, sehingga ditampilkan sebagai ^[. The ^tanda secara tradisional digunakan sebagai awalan untuk karakter kontrol, dan melarikan diri adalah ^[karena nilai byte nya: itu nilai byte dari [, dikurangi 64.

Jika Anda menekan Uppada prompt shell, ini mengirimkan urutan 3 karakter yang sama ke shell Anda. Shell mengartikan ini sebagai urutan perintah (biasanya untuk mengingat item sejarah sebelumnya). Jika Anda menekan Ctrl+ Vlalu Uppada prompt shell, ini menyisipkan urutan keluar pada prompt: Ctrl+V adalah perintah untuk memasukkan karakter berikutnya secara harfiah alih-alih menafsirkannya sebagai perintah, sehingga karakter tersebut tidak ditafsirkan sebagai awal urutan escape .

Beberapa kunci hanya pengubah dan tidak dikirimkan ke aplikasi terminal. Misalnya, ketika Anda menekan Shift, informasi ini tetap berada di driver terminal, dan diperhitungkan jika Anda kemudian menekan A, sehingga driver mengirim Ake aplikasi bukana .

Selain itu beberapa tombol fungsi mungkin tidak dipetakan di konsol Anda.

Untuk tampilan serupa di GUI, lihat Apa itu kunci meta bash?

Gilles 'SANGAT berhenti menjadi jahat'
sumber
Ini jawaban yang bagus, terima kasih Gilles seperti biasa.
JoshuaRLi
5

Ini bukan tentang bagaimana kunci diwakili oleh "terminal" (yaitu, aplikasi terminal emulator). Apa yang Anda lihat adalah kode ANSI ( urutan pelarian ANSI ) untuk bergerak ke atas satu baris, tetapi diterjemahkan ke dalam bentuk yang dapat dicetak.

  1. Perangkat keras keyboard mengirim "kode pindai", tetapi diterjemahkan dan disajikan ke aplikasi tingkat perintah sebagai karakter. Kunci Amenjadi satu byte: Ajika tombol Shift turun (atau Shift Lock), ajika tidak.

  2. Dalam sebuah terminal ANSI-compliant, tombol panah tidak mengirim satu karakter (tidak ada kode untuk panah di set karakter ASCII), tetapi 3-karakter "urutan escape": escape-[-A. Tiga tombol panah lainnya adalah escape-[-B, C, D.

  3. Urutan karakter yang sama akan memindahkan kursor ke atas oleh satu baris jika dikirim (digema) ke terminal ANSI fisik lama. Banyak program, termasuk emulator terminal, mengenali urutan karakter ini dan melakukan sesuatu yang sesuai: emulator terminal akan menggerakkan kursor ke atas (ini adalah cara cursesperpustakaan memindahkan kursor), tetapi bashakan mencegatnya dan gulir sejarah sebagai gantinya.

  4. Untuk menghindari kursor berakhir di semua tempat dalam program yang tidak digunakan untuk memindahkan kursor di sekitar layar, Anda akan sering melihat ESC pada input keyboard ditampilkan sebagai urutan yang dapat dicetak ^[(karena escape sesuai dengan control-[). Ini sebenarnya ditangani oleh antarmuka perangkat terminal; lihat stty(1). Akibatnya, panah atas akan muncul sebagai^[[A . Anda akan melihat ini dari baris perintah jika Anda mengetik cat, tekan kembali, dan tekan beberapa tombol panah. Ini juga yang Anda lihat di layar login konsol.

Akhirnya: Control,, Altdan kunci lain yang Anda sebutkan tidak memetakan ke urutan karakter. Mereka mempengaruhi karakter yang dikirim oleh penekanan tombol lain (seperti a/ Acontoh di atas), atau mereka tidak memiliki pemetaan ke teks. Tekan tombol seperti itu hanya dapat dideteksi oleh program yang mendengarkan acara keyboard. Mereka tidak dapat dilihat dengan membaca dari input standar (atau ditulis ke file).

alexis
sumber
3

Perilaku ini berbeda dari shell ke shell. Kebanyakan shell menggunakan library yang dipanggil readlineuntuk mengedit baris di prompt. Berikut ini adalah referensi perintah lengkap untuk pustaka ini, jadi ketika aplikasi menggunakan readlineAnda dapat mengedit dan menavigasi baris dengan perintah ini.

Tombol panah vertikal dikonfigurasikan dalam readline untuk menavigasi riwayat perintah. Dan di promt login tidak ada sejarah perintah. Itu sebabnya karakter ^[[Adan ^[[Bdicetak di layar. Jadi apa ^[[Aartinya?

Halaman manual bash tertulis di bawah PROMPTING:

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

The escape sequence untuk tombol panah di ANSI adalah:

  • [ValueAKursor naik (di mana Valuebisa emtpy)

  • [ValueBKursor ke bawah (tempat Valuedapat emtpy)

kekacauan
sumber
5
Jawaban Anda adalah tentang hal yang berbeda, karena prompt login dicetak dan ditangani oleh login, yang tidak terkait bash.
Risto Salminen
1
bashdan loginmenggunakan pustaka yang sama (readline) untuk mengedit baris. Perbedaannya hanyalah bahwa loginjangan menginterpretasikan tombol panah vertikal sebagai perintah, seperti bashhalnya.
chaos
Ya saya akui itu.
Risto Salminen
Sintaks bash dimaksudkan untuk terlihat seperti ^[representasi escape, tetapi mereka berbeda. Bash bisa menggunakan sintaks sama sekali. Bahkan, ketika Anda menulis \[A, bash menghasilkan tiga karakter: ^[(yaitu melarikan diri) [,, A.
alexis
0

Itu adalah kode pelarian ANSI . ^[adalah notasi yang digunakan shell Anda untuk menampilkan ESCbyte (ASCII byte 27). Jadi contoh Anda adalah byte ESC diikuti oleh teks [A. Seperti yang Anda lihat di artikel Wikipedia, ^[[( ESCdiikuti oleh [) adalah Pengantar Urutan Kontrol atau CSI. CSI Aberarti memindahkan kursor ke atas dengan satu kolom.

Jika Anda ingin melihat kode jalan keluar di terminal, ketik CTRL + V dan kemudian urutan tombol lainnya. Sebagai contoh, CTRL + V diikuti oleh panah atas menunjukkan ^[[A.

yellowantphil
sumber
0

Shell perintah, misalnya Bash adalah program yang menerjemahkan panah ke dalam tindakan "mengambil perintah sebelumnya". Anda tidak memiliki shell perintah yang berjalan.

Enzo
sumber
0

TLDR

Anda mungkin menjalankan shyang menghasilkan kode kunci mentah yang dihasilkan ketika Anda menekan tombol panah Atas.

Shell yang lebih canggih seperti bashmemotong kode kunci ini dan melakukan sesuatu dengannya. Misalnya tunjukkan perintah terakhir dalam sejarahnya.

Snowcrash
sumber