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 ^[[A
semacam karakter menyiratkan sesuatu?
getty
ataulogin
, 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.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
A
ke aplikasi bukana
.Selain itu beberapa tombol fungsi mungkin tidak dipetakan di konsol Anda.
Untuk tampilan serupa di GUI, lihat Apa itu kunci meta bash?
sumber
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.
Perangkat keras keyboard mengirim "kode pindai", tetapi diterjemahkan dan disajikan ke aplikasi tingkat perintah sebagai karakter. Kunci Amenjadi satu byte:
A
jika tombol Shift turun (atau Shift Lock),a
jika tidak.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 adalahescape-[-B, C, D
.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
curses
perpustakaan memindahkan kursor), tetapibash
akan mencegatnya dan gulir sejarah sebagai gantinya.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 dengancontrol-[
). Ini sebenarnya ditangani oleh antarmuka perangkat terminal; lihatstty(1)
. Akibatnya, panah atas akan muncul sebagai^[[A
. Anda akan melihat ini dari baris perintah jika Anda mengetikcat
, 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
/A
contoh 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).sumber
Perilaku ini berbeda dari shell ke shell. Kebanyakan shell menggunakan library yang dipanggil
readline
untuk mengedit baris di prompt. Berikut ini adalah referensi perintah lengkap untuk pustaka ini, jadi ketika aplikasi menggunakanreadline
Anda 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
^[[A
dan^[[B
dicetak di layar. Jadi apa^[[A
artinya?Halaman manual bash tertulis di bawah
PROMPTING
:The escape sequence untuk tombol panah di ANSI adalah:
[ValueA
Kursor naik (di manaValue
bisa emtpy)[ValueB
Kursor ke bawah (tempatValue
dapat emtpy)sumber
login
, yang tidak terkaitbash
.bash
danlogin
menggunakan pustaka yang sama (readline) untuk mengedit baris. Perbedaannya hanyalah bahwalogin
jangan menginterpretasikan tombol panah vertikal sebagai perintah, sepertibash
halnya.^[
representasiescape
, tetapi mereka berbeda. Bash bisa menggunakan sintaks sama sekali. Bahkan, ketika Anda menulis\[A
, bash menghasilkan tiga karakter:^[
(yaitu melarikan diri)[
,,A
.Itu adalah kode pelarian ANSI .
^[
adalah notasi yang digunakan shell Anda untuk menampilkanESC
byte (ASCII byte 27). Jadi contoh Anda adalah byte ESC diikuti oleh teks[A
. Seperti yang Anda lihat di artikel Wikipedia,^[[
(ESC
diikuti oleh[
) adalah Pengantar Urutan Kontrol atau CSI.CSI A
berarti 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
.sumber
Shell perintah, misalnya Bash adalah program yang menerjemahkan panah ke dalam tindakan "mengambil perintah sebelumnya". Anda tidak memiliki shell perintah yang berjalan.
sumber
TLDR
Anda mungkin menjalankan
sh
yang menghasilkan kode kunci mentah yang dihasilkan ketika Anda menekan tombol panah Atas.Shell yang lebih canggih seperti
bash
memotong kode kunci ini dan melakukan sesuatu dengannya. Misalnya tunjukkan perintah terakhir dalam sejarahnya.sumber