bashがncursesに接続されるのはなぜですか?

bashがncursesに接続されるのはなぜですか?

私はこれに以前気づいたようですが、実際に考えたことはありません。今は気になります。

> 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の一部です。これはFedoraシステムですが、Ubuntuでも同じです。 raspbian(Debianのバリエーション)では、libncurses自体にも接続されることがわかりました。

その理由は何ですか?私はbashがすることはすべてlibreadline(奇妙なことに接続されていない)で行うことができると思います。これは単なる代替品ですか?

ベストアンサー1

次のように実行する場合bash

LD_DEBUG=bindings bash

GNUシステムとbash.*tinfogrep for出力で次のようなものを見ることができます。

   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'

tinfoのこれらのシンボルが使用されてnm -D /bin/bashいることを出力で確認できます。bash

これらのシンボルを提供するマニュアルページでは、そのシンボルの目的を明確にすることができます。

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

デフォルトではbashreadline静的にリンクされたlibreadlineエディタはそれを使用してターミナル機能のterminfoデータベースを照会して、ラインエディタをすべてのデバイスで正しく実行できます(正しいエスケープシーケンスを送信してキーを正しく識別します)。端末。

readlineがなぜ静的にリンクされているのかについては、同じ人が一緒に開発し、に含まれていることを覚えておく必要がありますbashreadlinebashbash

bashシステムにインストールされているバージョンへのリンクを構築することは可能ですlibreadlineが、バージョンが互換性のあるバージョンであり、これがデフォルト以外の場合にのみ可能です。configureコンパイル時に使用する必要があります--with-installed-readline

おすすめ記事