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

答え2

bash用語キャップアプリケーションreadline、良いscreenと他のプログラムを介して。ほとんどのLinuxベースのシステム(Slackwareを除く)では、おそらくncursesを基本的な実装として考えています。用語キャップ

これマニュアルページtgetent(名前付きcurs_termcapそれがSVr4で行われる方法なので...)は次のように言いました:

これらのルーチンは、以下を使用するプログラムの変換補助ツールとして含まれます。用語キャップ図書館。対応するパラメーターは同じで、ルーチンは以下を使用してシミュレートされます。用語情報 データベース。したがって、アイテムの機能を照会するためにのみ使用できます。用語情報アイテムがコンパイルされました。

つまり、呼び出し元プログラムが返されたデータを詳しく見ずに、代わりに従来のtermcapインターフェースを使用して端末の説明を読み取ってデータを画面に書き込むと、生のtermcapのように動作します。

ほとんどのtermcapアプリケーションはあまり慎重に見えません(xtermはまれな例外です)。FAQを見る)。したがって、bashncursesで使用できます。

しかし、termcapライブラリはncursesよりも小さいです。これはずっと前から重要だったし、1997年から--with-termlibncursesには、上位レベルのcursライブラリに必要な機能とは別に、termcapおよびterminfo固有の部分をライブラリに構築する設定オプションがあります。数年が経つにつれて、一部のLinuxベースのディストリビューションはそれをパッケージに統合しました。

bashカース関数(libncursesなど)を使用しないためlibtinfo

readlinetermcap 特定の部分ですbash(実際に最初に触れたとき、bashtermcap の部分は次のようになります。ハードコーディング、公式ソースはtermcapを使用しますが、おそらくより多くのバイトを節約するために)。bashバンドルビルドを使用するときは、バンドルをreadline(クラッシュする可能性のある)共有ライブラリとしてインストールすることはreadline意味がないため、それを別のライブラリとして扱うことはありません。readlineしかし、(システムに応じて)libtinfoncursesは両方とも1つの方法(分割するかどうか)で構築されるため、これを見ることができます。

関連情報