Bagaimana dan di mana $ TERM ditafsirkan?

9

Saya bertanya-tanya bagaimana beberapa sihir terminal bekerja secara internal.

Saat bermain-main dengan wadah buruh pelabuhan, variabel lingkungan $TERMtidak ditetapkan. Hal ini menyebabkan aplikasi konsol yang tampak aneh seperti vim dan tmux, tetapi juga CTRL + l (layar jernih) diabaikan.

Saya cukup yakin bahwa semua fitur seperti pembaruan layar parsial, warna, perintah seperti reset layar dll direalisasikan menggunakan kode melarikan diri, kan?

Jadi di mana variabel ini ditafsirkan dan memungkinkan misalnya mengatur ulang layar terminal saya menggunakan CTRL + l jika saya menetapkan nilai yang benar di sana? Siapa yang memeriksa misalnya warna mana yang didukung (xterm vs xterm-256color)? Kerang? Aplikasi atau perpustakaan seperti ncurses? Dan di mana nilai-nilai / tipe-tipe terminal yang mungkin didefinisikan?

muffel
sumber

Jawaban:

8

$TERMdibaca dan ditafsirkan oleh sistem terminfo. terminfo juga merujuk ke database deskripsi terminal yang dapat Anda temukan di sebagian besar sistem di /usr/share/terminfo. $TERMharus cocok dengan salah satu entri dalam database itu. Ada juga perpustakaan yang lebih tua yang disebut termcap yang memiliki kemampuan lebih sedikit, tetapi terminfo telah menggantinya. Dalam sistem modern, terminfo adalah bagian dari perpustakaan ncurses.

Aplikasi biasanya mengambil kapabilitas terminal secara langsung menggunakan fungsi pustaka seperti tigetstr()atau mereka menggunakan antarmuka kutukan tingkat yang lebih tinggi untuk mengelola tata letak layar. Either way, $TERMdan database terminfo akan dikonsultasikan.

Celada
sumber
5

The TERMvariabel ditafsirkan oleh masing-masing aplikasi, melalui sistem perpustakaan. Nilainya adalah nama yang dicari dalam database. Bergantung pada rasa Unix dan umurnya, database dapat berupa termcap (tradisional, tidak banyak digunakan saat ini) atau terminfo (modern, karena itu dimaksudkan sebagai perbaikan pada termcap, dan digunakan oleh sebagian besar sistem saat ini).

Basis data termcap dan terminfo mengaitkan nama kemampuan dengan nilai. Kemampuan adalah deskripsi dari apa yang dapat dilakukan terminal (jumlah garis, kemampuan untuk menggarisbawahi, dll.) Atau string yang dapat ditukar dengan terminal (urutan sekuensi untuk memformat teks, memindahkan kursor di sekitar, dll., Dan di sisi lain urutan pelarian arah yang dikirim oleh tombol fungsi). Anda dapat melihat man 5 termcapdan man 5 terminfomelihat kemampuan apa yang diketahui di sistem Anda.

Sebagai contoh, ketika Anda menekan Ctrl+ Luntuk menggambar ulang layar, ia membaca kemampuan dalam basis data terminal untuk mencari tahu urutan melarikan diri apa yang harus digunakan untuk memindahkan kursor. Jika TERMtidak disetel atau tidak diatur dengan benar, layar tidak memiliki cara untuk mengetahui cara menggerakkan kursor.

Anda dapat menggunakan tputperintah untuk mengambil entri dalam basis data terminfo. Misalnya tput linesmencetak jumlah garis pada terminal. tput clearmembersihkan layar (karena hasilnya semakin dicetak pada terminal); untuk melihat apa urutan pelarian yang sesuai, cetak dalam bentuk yang dapat dibaca, misalnya tput clear | cat -v.

Jumlah warna memiliki sedikit sejarah yang membuatnya tidak berfungsi sebagaimana mestinya oleh hak: emulator terminal cenderung melaporkan jumlah warna mereka, untuk menghindari kerusakan beberapa aplikasi. Lihat dukungan tmux, TERM dan 256 warna untuk lebih lanjut tentang ini, terutama dalam konteks tmux. Perbedaan antara xterm-256colorsdan xtermadalah bahwa yang pertama melaporkan 256 warna dalam terminfo sedangkan yang kedua melaporkan 8 tradisional.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
2

TERM, menurut konvensi mengacu pada deskripsi terminal. Awalnya ini bernama bagian dari file teks termcap (dimulai pada akhir 1970-an). Pada pertengahan 1980-an, terminfo diperkenalkan sebagai file yang dikompilasi (biner) yang menghemat waktu saat mendapatkan deskripsi terminal. Walaupun keduanya tersedia untuk semua platform seperti Unix, termcap jarang digunakan saat ini kecuali sebagai emulasi menggunakan terminfo.

Untuk kedua format data ini, aplikasi biasanya mengekstrak data dari basis data terminal dengan pustaka pemrograman yang dapat digunakan kembali. Pustaka pemrograman terminfo biasanya merupakan bagian dari pustaka kutukan tingkat tinggi meskipun mungkin disediakan (misalnya, opsional seperti dalam ncurses) sebagai file pustaka yang terpisah. Apakah perpustakaan terminfo disediakan secara terpisah atau tidak, dalam kasus ini dianggap sebagai perpustakaan kutukan. (Ada juga beberapa perpustakaan tingkat tinggi lainnya seperti bahasa gaul).

Entri basis data terminal untuk setiap terminal berisi properti yang disebut kemampuan . Mereka memberi tahu perpustakaan kutukan (atau aplikasi yang menggunakan termcap / terminfo secara langsung) bagaimana melakukan operasi yang bermanfaat seperti menghapus layar. Untuk sebagian besar terminal yang merupakan urutan keluar. Beberapa terminal mungkin tidak mendukung urutan pelarian untuk tujuan ini; ada kemampuan lain yang dapat dikombinasikan oleh perpustakaan kutukan untuk menghapus layar (seperti membersihkan setiap baris). Tidak semua kemampuan adalah urutan pelarian. Ada kemampuan boolean dan angka juga, misalnya, untuk mengetahui apakah suatu fitur didukung, dan seberapa besar sesuatu itu (seperti ukuran layar).

Setiap aplikasi yang menggunakan termcap / terminfo menggunakan pustaka yang sesuai untuk mengambil deskripsi terminal, serta untuk melakukan operasi seperti mengganti parameter ke dalam kemampuan tertentu. Sebagai contoh, sebagian besar terminal menyediakan kemampuan untuk memindahkan kursor dengan jumlah kolom atau baris tertentu dari lokasi saat ini. Fungsi tparm(atau tiparm) menggantikan angka ke dalam kapabilitas untuk mendapatkan urutan pelarian aktual.

Kutukan perpustakaan memiliki aplikasi baris perintah yang menjaga database terminal ( tic , infocmp ) dan beberapa yang digunakan dalam skrip shell untuk query database terminal atau melakukan operasi tingkat rendah dengan kemampuan terminal ( tput , uji di / reset ).

Ada aplikasi tidak konvensional yang digunakan TERMtanpa menggunakan database terminal. Sebagian besar dari mereka hanya melakukan hardcode perilakunya (seperti GNU grep, groff, dan tautan / links2 / elinks peramban web tekstual), sementara beberapa memiliki jumlah yang sama dengan basis data terminal mereka sendiri (seperti GNU ls), tetapi menggunakan aturan dan tingkah laku.

Kembali ke pertanyaan:

  • Jadi di mana variabel ini ditafsirkan dan memungkinkan misalnya mengatur ulang layar terminal saya menggunakan CTRL + l jika saya menetapkan nilai yang benar di sana?

    Aplikasi dan pustaka yang mendasarinya menafsirkan nilai ini. Sebab controlL, itu dapat dilakukan untuk bash di perpustakaan readline (yang menggunakan antarmuka pemrograman termcap).

  • Siapa yang memeriksa misalnya warna mana yang didukung (xterm vs xterm-256color)?

    Basis data terminal menyimpan jumlah warna sebagai kemampuan, bersama dengan kemampuan untuk mengatur warna latar depan dan latar belakang serta mengatur ulang warna. Beberapa aplikasi menggabungkan kemampuan ini dengan informasi lain (seperti pernyataan pengembang yang xterm"benar-benar" xterm-256color).

  • Kerang?

    Sebagian besar shell menggunakan antarmuka pemrograman termcap untuk mendapatkan informasi terminal. Namun, mereka adalah aplikasi yang memiliki perilaku mereka sendiri (belum tentu sama dengan kutukan).

  • Aplikasi atau perpustakaan seperti ncurses?

    (lihat di atas: cangkang adalah jenis aplikasi tertentu)

  • Dan di mana nilai-nilai / tipe-tipe terminal yang mungkin didefinisikan?

    Biasanya yang ada di database terminal dibagi oleh aplikasi menggunakan kutukan atau perpustakaan slang. Beberapa aplikasi di-hardcode atau menggunakan database pribadi.

Bacaan lebih lanjut:

Thomas Dickey
sumber