Mengapa tautan bash ke ncurses?

11

Saya pikir saya sudah memperhatikan ini sebelumnya tetapi tidak pernah terlalu memikirkannya; sekarang saya penasaran.

> ldd /bin/bash
        linux-vdso.so.1 =>  (0x00007fff2f781000)
        libtinfo.so.5 => /lib64/libtinfo.so.5 (0x00007f0fdd9a9000)
        libdl.so.2 => /lib64/libdl.so.2 (0x00007f0fdd7a5000)
        libc.so.6 => /lib64/libc.so.6 (0x00007f0fdd3e6000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f0fddbf6000)

Libtinfo adalah bagian dari ncurses. Ini adalah sistem fedora, tetapi sama di ubuntu, dan saya perhatikan pada raspbian (varian debian) itu juga terhubung ke libncurses itu sendiri.

Apa alasannya? Saya pikir semua yang dilakukan bash dapat dilakukan dengan libreadline (yang anehnya, itu tidak terhubung ke). Apakah ini hanya pengganti untuk itu?

goldilocks
sumber
Itu bagian dari ncurses? Deskripsi paket ( pustaka terminfo tingkat rendah yang dibagikan untuk penanganan terminal ) tidak mengatakan apa-apa ( package.ubuntu.com/trusty/libtinfo5 ), dan kedengarannya masuk akal untuk dimiliki oleh shell. Mungkin dibutuhkan untuk nilai TERM? Ah, sudahlah - Saya melihat paket sumbernya ncurses.
muru
zshjuga tautan ke libtinfo, juga
cuonglm

Jawaban:

17

Jika Anda menjalankan bashsebagai:

LD_DEBUG=bindings bash

pada sistem GNU, dan menerima bash.*tinfodalam output itu, Anda akan melihat sesuatu seperti:

   797:     binding file bash [0] to /lib/x86_64-linux-gnu/libtinfo.so.5 [0]: normal symbol `UP'
   797:     binding file bash [0] to /lib/x86_64-linux-gnu/libtinfo.so.5 [0]: normal symbol `PC'
   797:     binding file bash [0] to /lib/x86_64-linux-gnu/libtinfo.so.5 [0]: normal symbol `BC'
   797:     binding file bash [0] to /lib/x86_64-linux-gnu/libtinfo.so.5 [0]: normal symbol `tgetent'
   797:     binding file bash [0] to /lib/x86_64-linux-gnu/libtinfo.so.5 [0]: normal symbol `tgetstr'
   797:     binding file bash [0] to /lib/x86_64-linux-gnu/libtinfo.so.5 [0]: normal symbol `tgetflag'

Anda dapat mengkonfirmasi dari output nm -D /bin/bashyang bashmenggunakan simbol-simbol dari tinfo.

Membawa halaman manual untuk simbol-simbol itu menjelaskan untuk apa simbol-simbol itu:

$ man tgetent
NAME
   PC, UP, BC, ospeed, tgetent, tgetflag, tgetnum, tgetstr, tgoto, tputs -
   direct curses interface to the terminfo capability database

Pada dasarnya,, bashlebih mungkin readlineeditornya (libreadline terhubung secara statis), menggunakan editor tersebut untuk meminta basis data terminfo untuk mencari tahu tentang kapabilitas terminal sehingga dapat menjalankan editor lini dengan benar (mengirimkan urutan jalan keluar yang tepat dan mengidentifikasi penekanan tombol dengan benar) pada sembarang terminal.

Mengenai mengapa readline terhubung secara statis ke dalam bash, Anda harus mengingat bahwa readlineyang dikembangkan bersama basholeh orang yang sama dan termasuk dalam sumber bash.

Dimungkinkan untuk membangun bashuntuk dihubungkan dengan sistem yang diinstal libreadline, tetapi hanya jika yang itu adalah versi yang kompatibel, dan itu bukan default. Anda harus memanggil configureskrip pada saat kompilasi --with-installed-readline.

Stéphane Chazelas
sumber
2

bashadalah aplikasi termcap via readline, like, screendan beberapa program lainnya. Pada kebanyakan sistem berbasis Linux (selain Slackware), Anda cenderung melihat ncurses sebagai implementasi mendasar dari termcap .

The halaman manual untuktgetent (bernama curs_termcap karena itulah cara itu dilakukan di SVR4 ...) mengatakan:

Rutinitas ini disertakan sebagai bantuan konversi untuk program yang menggunakan perpustakaan termcap . Parameter mereka sama dan rutinitas ditiru menggunakan basis data terminfo . Dengan demikian, mereka hanya dapat digunakan untuk menanyakan kemampuan entri yang telah dikompilasi oleh entri terminfo .

Artinya, jika program panggilan tidak melihat dengan seksama pada data yang dikembalikan, dan menggunakan antarmuka termcap konvensional untuk membaca deskripsi terminal dan menulis data ke layar, itu berfungsi seperti termcap asli.

Sebagian besar aplikasi termcap tidak terlalu memperhatikan (xterm adalah pengecualian yang jarang - lihat FAQ ). Begitu juga bashdengan ncurses.

Namun, pustaka termcap lebih kecil dari ncurses. Beberapa waktu yang lalu itu penting, dan sejak 1997 ncurses telah memiliki opsi konfigurasi --with-termlibyang membuatnya membangun bagian-bagian spesifik termcap dan terminfo sebagai perpustakaan yang terpisah dari fungsi-fungsi yang diperlukan di perpustakaan kutukan tingkat tinggi. Beberapa tahun berlalu, dan beberapa distribusi berbasis Linux memasukkannya ke dalam paket mereka.

Karena bashtidak menggunakan salah satu fungsi kutukan (libncurses, dll.), Masuk akal untuk menautkan hanya terhadap libtinfo.

readlineadalah bagian spesifik-termcap dari bash(sebenarnya ketika saya pertama kali bertemu bash, bagian-bagian termcap-nya adalah hardcode , meskipun sumber resmi menggunakan termcap - mungkin untuk menyimpan beberapa byte lagi). Ketika bashdibangun dengan bundel readline, Anda tidak akan melihat readlinesebagai pustaka yang terpisah karena tidak ada gunanya menjadikan readlineinstalasi yang dibundel sebagai pustaka bersama (yang mungkin bertentangan). Tetapi (tergantung pada sistem Anda), Anda mungkin melihat libtinfokarena ncurses dibangun dengan satu atau lain cara (terpisah atau tidak) - tidak keduanya.

Thomas Dickey
sumber