Warum verbindet sich Bash mit Flüchen?

11

Ich glaube, ich habe das schon einmal bemerkt, aber nie viel darüber nachgedacht. jetzt bin ich neugierig.

> 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 ist Teil von ncurses. Dies ist ein Fedora-System, aber es ist dasselbe auf Ubuntu, und ich stelle fest, dass es auf Raspbian (einer Debian-Variante) auch auf libncurses selbst verweist.

Was ist der Grund dafür? Ich dachte, alles, was Bash gemacht hat, könnte mit libreadline gemacht werden (was seltsamerweise nicht damit verknüpft ist). Ist das einfach ein Ersatz dafür?

Goldlöckchen
quelle
Es ist Teil von Flüchen? Die Paketbeschreibung ( gemeinsam genutzte Low-Level-Terminfo-Bibliothek für die Terminalbehandlung ) sagt nichts aus ( packages.ubuntu.com/trusty/libtinfo5 ), und es klingt vernünftig, eine Shell zu haben. Vielleicht für Werte von benötigt TERM? Ah, egal - ich sehe das Quellpaket ist ncurses.
Muru
zshauch Link zu libtinfo auch
cuonglm

Antworten:

17

Wenn Sie ausführen bashals:

LD_DEBUG=bindings bash

Auf einem GNU-System sehen bash.*tinfoSie in dieser Ausgabe Folgendes:

   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'

Sie können anhand der Ausgabe bestätigen, nm -D /bin/bashdass Sie bashdiese Symbole von tinfo verwenden.

Wenn Sie die Manpage für eines dieser Symbole aufrufen, wird klargestellt, wofür sie bestimmt sind:

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

Im Grunde genommen bash, eher seinen readlineEditor (libreadline statisch verknüpft ist), verwenden diejenigen , die die term Datenbank abzufragen über Terminal - Fähigkeiten , um herauszufinden , damit es seinen Zeileneditor richtig laufen kann (die richtigen Escape - Sequenzen zu senden und Tastendrücke korrekt identifizieren) auf jedem Terminal.

Wie, warum ist Readline- in statisch gelinkte bash, müssen Sie bedenken , dass readlineneben entwickelt bashvon der gleichen Person und ist in der Quelle enthält bash.

Es ist möglich, basheine Verknüpfung mit dem installierten System herzustellen libreadline, jedoch nur, wenn dieses eine kompatible Version hat, und dies ist nicht die Standardeinstellung. Sie müssen das configureSkript zur Kompilierungszeit mit aufrufen --with-installed-readline.

Stéphane Chazelas
quelle
2

bashist eine Termcap- Anwendung über readline, wie screenund einige andere Programme. Auf den meisten Linux-basierten Systemen (abgesehen von Slackware) wird ncurses wahrscheinlich als zugrunde liegende Implementierung von termcap angesehen .

Die Handbuchseite fürtgetent ( curs_termcap genannt, weil es in SVr4 so gemacht wurde ...) sagt:

Diese Routinen sind als Konvertierungshilfe für Programme enthalten, die die termcap- Bibliothek verwenden. Ihre Parameter sind dieselben und die Routinen werden mithilfe der terminfo- Datenbank emuliert . Sie können daher nur verwendet werden, um die Funktionen von Einträgen abzufragen, für die ein terminfo- Eintrag kompiliert wurde.

Das heißt, wenn das aufrufende Programm die zurückgegebenen Daten nicht genau betrachtet und die herkömmliche Termcap-Schnittstelle zum Lesen der Terminalbeschreibung und zum Schreiben von Daten auf den Bildschirm verwendet, funktioniert es genau wie die ursprüngliche Termcap.

Die meisten Termcap-Anwendungen sehen nicht so genau aus (xterm ist eine seltene Ausnahme - siehe FAQ ). Funktioniert also bashmit Flüchen.

Die Termcap-Bibliothek ist jedoch kleiner als ncurses. Vor einiger Zeit war das wichtig, und seit 1997 verfügt ncurses über eine Konfigurationsoption --with-termlib, mit der die termcap- und terminfo-spezifischen Teile als Bibliothek erstellt werden können, die von den Funktionen der übergeordneten Curses-Bibliothek getrennt ist. Einige Jahre vergingen, und einige der Linux-basierten Distributionen haben dies in ihre Pakete aufgenommen.

Da bashkeine der Curses-Funktionen (libncurses usw.) verwendet wird, ist es sinnvoll, nur gegen die zu verlinken libtinfo.

readlineist der termcap-spezifische Teil von bash(tatsächlich bashwaren seine termcap-Teile bei meiner ersten Begegnung fest codiert , obwohl die offizielle Quelle termcap verwendete - vielleicht, um ein paar weitere Bytes zu sparen). Wenn bashes mit der gebündelten Bibliothek erstellt readlinewird, wird es nicht readlineals separate Bibliothek angezeigt, da es keinen Sinn macht, diese gebündelte readlineInstallation als (möglicherweise widersprüchliche) gemeinsam genutzte Bibliothek durchzuführen. Aber (abhängig von Ihrem System) können Sie sehen, libtinfodass ncurses auf die eine oder andere Weise erstellt wird (geteilt oder nicht) - nicht beides.

Thomas Dickey
quelle