Bash ncurses'a neden bağlanıyor?


11

Sanırım bunu daha önce fark ettim ama hiç düşünmedim; şimdi merak ediyorum.

> 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 ncurses'ın bir parçasıdır. Bu bir fedora sistemidir, ancak ubuntu'da da aynıdır ve raspbian (debian bir varyant) üzerinde de libncurses'ın kendisine bağlı olduğunu fark ettim.

Bunun sebebi ne? Ben bash'ın yaptığı her şeyin libreadline ile yapılabileceğini düşündüm (ki merakla bağlantı kurmuyor). Bu sadece bunun yerine mi geçiyor?


Bu ncurses'ın bir parçası mı? Paket açıklaması ( terminal kullanımı için paylaşılan düşük seviyeli terminfo kütüphanesi ) hiçbir şey söylemez ( Packages.ubuntu.com/trusty/libtinfo5 ) ve bir kabuğun olması makul görünüyor. Belki değerleri için gerekli TERM? Ah, boş ver - Kaynak paketin olduğunu görüyorum ncurses.
muru

zshAyrıca libtinfo için de bağlantı
cuonglm

Yanıtlar:


17

Şu şekilde çalıştırırsanız bash:

LD_DEBUG=bindings bash

bir GNU sisteminde ve bash.*tinfobu çıktıda grep için , şöyle bir şey görürsünüz:

   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'

Çıktısı gelen onaylayabilirsiniz nm -D /bin/basho bashtinfo gelenler sembolleri kullanıyor.

Bu sembollerden herhangi biri için kılavuz sayfasını getirmek, ne için olduklarını netleştirir:

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

Temel olarak, bashdaha büyük olasılıkla onun readlineo (sağ çıkış sıralarını gönderme ve doğru tuşa basma tespit) düzgün bir çizgi editörü çalışabilmesi için (libreadline statik içinde bağlantılıdır) editörü, herhangi terminali yetenekleri hakkında bilgi edinmek için terminfo veritabanını sorgulamak için bu kullanır terminal.

Readline'ın neden statik olarak bağlantılı basholduğuna gelince , aynı kişi tarafından readlinegeliştirilen bashve kaynağına dahil olan unutmayın bash.

bashSistemin kurulu olmasıyla bağlantı kurmak için inşa etmek mümkündür libreadline, ancak bu sadece uyumlu bir versiyona sahipse ve bu varsayılan değilse. configureKomut dosyasını derleme zamanında çağırmanız gerekir --with-installed-readline.


2

bash, like ve diğer bazı programlar aracılığıyla bir termcap uygulamasıdır . Linux tabanlı sistemlerin çoğunda (Slackware dışında), ncurses'ı termcap uygulamasının altında yatan uygulama olarak görürsünüz .readlinescreen

Manuel sayfatgetent (adlandırılmış curs_termcap o SVR4 yapıldığını yolu olduğu ...) diyor ki:

Bu yordamlar, termcap kitaplığını kullanan programlar için bir dönüştürme yardımcısı olarak dahil edilmiştir . Parametreleri aynıdır ve rutinler terminfo veritabanı kullanılarak taklit edilir . Bu nedenle, yalnızca bir terminfo girdisinin derlendiği girişlerin yeteneklerini sorgulamak için kullanılabilirler .

Yani, çağıran program döndürülen verilere yakından bakmazsa ve terminal açıklamasını okumak ve ekrana veri yazmak için geleneksel termcap arayüzünü kullanırsa, orijinal termcap gibi çalışır.

Çoğu termcap uygulaması yakından görünmüyor (xterm nadir bir istisnadır - SSS'ye bakın ). Yani bashncurses ile çalışır.

Ancak, termcap kütüphanesi ncurses'dan daha küçüktür. Oldukça uzun bir süre önce bu önemliydi ve 1997'den beri ncurses, --with-termlibtermcap ve terminfo'ya özgü parçaları bir üst düzey curses kütüphanesinde ihtiyaç duyulan fonksiyonlardan ayrı bir kütüphane olarak inşa etmesini sağlayan bir yapılandırma seçeneğine sahipti . Birkaç yıl geçti ve Linux tabanlı dağıtımların bazıları bunu paketlerine dahil etti.

Yana bashküfürler fonksiyonları (libncurses vs.) herhangi birini kullanmaz, bu karşı tek bağlamak mantıklı libtinfo.

readlinetermcap özgü parçasıdır bash(ilk karşılaşılan aslında zaman bash, onun termcap parçaları edildi kodlanmış - belki de daha birkaç byte kaydetmek için resmi kaynak Termcap kullanılan rağmen). Ne zaman bashbirlikte inşa edilmiştir readline, görmezsiniz readlinepaketlenmiş belirttik anlamı yok olacağını, çünkü ayrı bir kitaplık olarak readline(büyük olasılıkla çakışan) paylaşılan kitaplık olarak yükleyin. Ancak (sisteminize bağlı olarak) görebilirsiniz, libtinfoçünkü ncurses bir şekilde ya da diğerine (bölünmüş ya da değil) - her ikisine birden değil.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.