Perché bash si collega a ncurses?


11

Penso di averlo notato prima, ma non ci ho mai pensato molto; ora sono curioso.

> 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 fa parte di ncurses. Questo è un sistema fedora, ma è lo stesso su Ubuntu, e noto su raspbian (una variante debian) che si collega anche a libncurses.

Qual è la ragione di questo? Pensavo che tutto ciò che facesse Bash potesse essere fatto con libreadline (che curiosamente non si collega a). Questo è semplicemente un sostituto per quello?


Fa parte di ncurses? La descrizione del pacchetto ( libreria terminfo di basso livello condivisa per la gestione dei terminali ) non dice nulla ( pacchetti.ubuntu.com/trusty/libtinfo5 ) e sembra ragionevole che una shell abbia. Forse necessario per i valori di TERM? Ah, non importa - vedo che il pacchetto sorgente è ncurses.
Muru,

zshanche link a libtinfo
cuonglm,

Risposte:


17

Se corri bashcome:

LD_DEBUG=bindings bash

su un sistema GNU, e grep per bash.*tinfoin quell'output, vedrai qualcosa come:

   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'

È possibile confermare dall'output nm -D /bin/bashche bashsta utilizzando quei simboli da tinfo.

Portare la pagina man per uno di quei simboli chiarisce a cosa servono:

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

Fondamentalmente, bashpiù probabilmente il suo readlineeditor (libreadline è staticamente collegato), usa quelli per interrogare il database terminfo per scoprire le funzionalità del terminale in modo che possa eseguire correttamente il suo editor di linee (inviando le giuste sequenze di escape e identificare correttamente i tasti premuti) su qualsiasi terminale.

Per quanto riguarda perché readline è staticamente collegato bash, devi tenere presente che readlineè sviluppato insieme bashalla stessa persona ed è incluso nella fonte di bash.

È possibile costruire bashper essere collegato con il sistema installato libreadline, ma solo se quello è di una versione compatibile e non è l'impostazione predefinita. Devi chiamare lo configurescript al momento della compilazione con --with-installed-readline.


2

bashè un'applicazione termcap tramite readline, like screene alcuni altri programmi. Sulla maggior parte dei sistemi basati su Linux (oltre a Slackware), è probabile che vediate ncurses come implementazione sottostante di termcap .

La pagina di manuale pertgetent (chiamata curs_termcap perché è così che è stata fatta in SVr4 ...) dice:

Queste routine sono incluse come aiuto alla conversione per i programmi che usano la libreria termcap . I loro parametri sono gli stessi e le routine sono emulate usando il database terminfo . Pertanto, possono essere utilizzati solo per interrogare le capacità delle voci per le quali è stata compilata una voce terminfo .

Cioè, se il programma chiamante non osserva da vicino i dati restituiti e utilizza l'interfaccia termcap convenzionale per leggere la descrizione del terminale e scrivere i dati sullo schermo, funziona esattamente come il termcap originale.

La maggior parte delle applicazioni termcap non sembrano così da vicino (xterm è un'eccezione rara - vedi FAQ ). Quindi bashfunziona con ncurses.

Tuttavia, la libreria termcap è più piccola di ncurses. Un po 'di tempo fa importava e dal 1997 ncurses ha avuto un'opzione di configurazione --with-termlibche lo rende in grado di costruire le parti specifiche di termcap e terminfo come una libreria separata dalle funzioni necessarie nella libreria di curses di livello superiore. Passarono alcuni anni e alcune delle distribuzioni basate su Linux lo incorporarono nei loro pacchetti.

Dato bashche non usa nessuna delle funzioni maledizioni (libncurses, ecc.), È ragionevole collegarsi solo a libtinfo.

readlineè la parte specifica di termcap di bash(in realtà quando ho incontrato per la prima volta bash, le sue parti di termcap erano hardcoded , anche se la fonte ufficiale usava termcap - forse per salvare qualche altro byte). Quando bashviene creato con il bundle readline, non vedrai readlinecome libreria separata perché non avrebbe senso fare l' readlineinstallazione in bundle come libreria condivisa (possibilmente in conflitto). Ma (a seconda del tuo sistema), potresti vedere libtinfoperché ncurses è costruito in un modo o nell'altro (diviso o no) - non entrambi.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.