GNU/Linux >> Belajar Linux >  >> Linux

Bagaimana Cara Menampilkan Karakter Kontrol (^c, ^d, ^[, ...) Secara Berbeda Di Shell?

Saat Anda mengetik karakter kontrol di shell, mereka akan ditampilkan menggunakan apa yang disebut "notasi tanda sisipan". Escape misalnya ditulis sebagai ^[ dalam notasi caret.

Saya suka menyesuaikan bash shell saya agar terlihat keren. Saya misalnya telah mengubah PS1 saya dan PS2 menjadi berwarna. Sekarang saya ingin karakter kontrol mendapatkan tampilan yang unik juga untuk membuatnya lebih dapat dibedakan dari karakter biasa.

$ # Here I type CTRL-C to abort the command.
$ blahblah^C
          ^^ I want these two characters to be displayed differently

Apakah ada cara untuk membuat karakter kontrol sorotan shell saya berbeda?

Apakah mungkin untuk membuatnya menampilkannya dalam font tebal atau mungkin membuatnya muncul dalam warna yang berbeda dari teks biasa?

Saya menggunakan bash shell di sini tapi saya tidak menandai pertanyaan dengan bash karena mungkin ada solusi yang berlaku untuk banyak shell yang berbeda.

Catatan bahwa saya tidak tahu pada level apa penyorotan karakter kontrol terjadi. Saya pertama kali mengira itu ada di dalam cangkang itu sendiri. Sekarang saya telah mendengar bahwa itu adalah readline yang mengontrol bagaimana karakter kontrol dalam shell seperti bash . Jadi pertanyaannya sekarang ditandai dengan readline dan saya masih mencari jawaban.

Jawaban yang Diterima:

Saat Anda menekan Ctrl+X , emulator terminal Anda menulis byte 0x18 ke sisi master pasangan terminal-semu.

Apa yang terjadi selanjutnya tergantung pada bagaimana disiplin baris tty (modul perangkat lunak di kernel yang berada di antara sisi master (di bawah kendali emulator) dan sisi budak (aplikasi yang berjalan di terminal berinteraksi dengan)) dikonfigurasi.

Perintah untuk mengonfigurasi disiplin baris tty adalah stty perintah.

Saat menjalankan aplikasi bodoh seperti cat yang tidak mengetahui dan tidak peduli apakah stdinnya adalah terminal atau bukan, terminal dalam kanonik default mode di mana disiplin garis tty mengimplementasikan editor baris yang kasar .

Beberapa aplikasi interaktif yang membutuhkan lebih dari editor baris mentah itu biasanya mengubah pengaturan tersebut saat start-up dan mengembalikannya saat keluar. Cangkang modern, sesuai permintaannya adalah contoh dari aplikasi tersebut. Mereka menerapkan editor baris mereka sendiri yang lebih canggih.

Biasanya, saat Anda memasukkan baris perintah, shell menempatkan disiplin baris tty dalam mode itu, dan ketika Anda menekan enter untuk menjalankan perintah saat ini, shell mengembalikan mode tty normal (seperti yang berlaku sebelum mengeluarkan prompt).

Jika Anda menjalankan stty -a perintah, Anda akan melihat pengaturan saat ini digunakan untuk aplikasi bodoh . Anda mungkin melihat icanon , echo dan echoctl pengaturan sedang diaktifkan.

Artinya:

  • icanon :editor garis kasar itu diaktifkan.
  • echo :karakter yang Anda ketik (yang ditulis oleh emulator terminal ke sisi master) digemakan kembali (tersedia untuk dibaca oleh emulator terminal).
  • echoctl :bukannya digemakan asis, karakter kontrol digemakan sebagai ^X .

Jadi, katakanlah Anda mengetik A B Backspace-alias-Ctrl+H/? C Ctrl+X Spasi mundur Kembali .

Emulator terminal Anda akan mengirim:ABbCx18br . Disiplin garis akan bergema kembali:ABb bC^Xb bb brn , dan aplikasi yang membaca input dari sisi slave (/dev/pts/x ) akan membaca ACn .

Semua yang dilihat aplikasi adalah ACn , dan hanya jika Anda menekan Enter sehingga tidak dapat mengontrol output untuk ^X di sana.

Terkait:Apa pembacaan file conf antara shell login dan non-login?

Anda akan melihat bahwa untuk echo , ^H first yang pertama (^? dengan beberapa terminal, lihat erase setting) menghasilkan b b dikirim kembali ke terminal. Begitulah urutan untuk memundurkan kursor, menimpa dengan spasi, memindahkan kursor kembali lagi, sedangkan yang kedua ^H menghasilkan b bb b untuk menghapus kedua ^ dan X karakter.

^X (0x18) sendiri sedang diterjemahkan ke ^ dan X untuk keluaran. Seperti B , itu tidak berhasil masuk ke aplikasi, karena kami menghapusnya dengan Backspace.

r (alias ^M ) diterjemahkan ke rn (^M^J ) untuk gema, dan n (^J ) untuk aplikasi.

Jadi, apa pilihan kita untuk mereka yang bodoh aplikasi:

  • nonaktifkan echo (stty -echo ). Itu secara efektif mengubah cara karakter kontrol digaungkan, dengan… tidak menggemakan apa pun. Benar-benar bukan solusi.
  • nonaktifkan echoctl . Itu mengubah cara mengontrol karakter (selain ^H , ^M … dan semua yang lain yang digunakan oleh editor baris) digemakan. Mereka kemudian digemakan dengan adanya. Misalnya, karakter ESC dikirim sebagai e (^[ /0x1b ) byte (yang dikenali sebagai awal dari urutan escape oleh terminal), ^G Anda mengirim a (a BEL, membuat terminal Anda berbunyi bip)… Bukan pilihan.
  • nonaktifkan editor garis kasar (stty -icanon ). Sebenarnya bukan pilihan karena aplikasi kasar akan menjadi jauh lebih tidak berguna.
  • edit kode kernel untuk mengubah perilaku disiplin baris tty sehingga echo dari karakter kontrol mengirim e[7m^Xe[m bukan hanya ^X (di sini e[7m biasanya mengaktifkan video terbalik di sebagian besar terminal).

Pilihannya bisa menggunakan pembungkus seperti rlwrap itu adalah peretasan kotor untuk menambahkan editor baris mewah ke aplikasi bodoh. Pembungkus itu sebenarnya mencoba menggantikan read() simple sederhana s dari perangkat terminal ke panggilan ke editor baris readline (yang memang mengubah mode disiplin baris tty).

Lebih jauh lagi, Anda bahkan dapat mencoba solusi seperti ini yang membajak semua input dari terminal untuk melalui editor baris zsh (yang kebetulan menyorot ^X s dalam video terbalik) mengandalkan :exec layar GNU fitur.

Sekarang untuk aplikasi yang mengimplementasikan editor baris mereka sendiri, terserah mereka untuk memutuskan bagaimana gema dilakukan. bash menggunakan readline untuk yang tidak memiliki dukungan untuk menyesuaikan bagaimana karakter kontrol digaungkan.

Untuk zsh , lihat:

info --index-search='highlighting, special characters' zsh

zsh tidak menyorot karakter yang tidak dapat dicetak secara default. Anda dapat menyesuaikan penyorotan dengan misalnya:

zle_highlight=(special:fg=white,bg=red)

Untuk penyorotan putih di atas merah untuk karakter khusus tersebut.

Representasi teks dari karakter tersebut tidak dapat disesuaikan.

Di lokal UTF-8, 0x18 akan dirender sebagai ^X , u378 , U7fffffff (dua poin kode unicode yang belum ditetapkan) sebagai <0378> , <7FFFFFFF> , u200b (karakter unicode yang tidak dapat dicetak) sebagai <200B> .

x80 di lokal iso8859-1 akan dirender sebagai ^� … dll.


Linux
  1. Bagaimana Cara Menetapkan Output Perintah Ke Variabel Shell?

  2. Bagaimana Mendeteksi Jika Shell Dikendalikan Dari Ssh?

  3. Cara menggemakan Baris Baru di Bash Shell Script

  1. Bagaimana cara mengubah karakter hex ke ASCII di shell Linux?

  2. Cara menyampaikan argumen di Harapkan melalui baris perintah dalam skrip Shell

  3. dapatkan 5 karakter pertama dari setiap baris dalam skrip Shell

  1. Bagaimana cara menjalankan perintah Vim dari shell?

  2. Bagaimana cara menampilkan isi file secara rekursif?

  3. Bagaimana cara menampilkan parameter baris perintah kernel Linux yang diberikan untuk boot saat ini?