私はこれに以前気づいたようですが、実際に考えたことはありません。今は気になります。
> 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.*tinfo
grep 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
デフォルトではbash
、readline
静的にリンクされたlibreadlineエディタはそれを使用してターミナル機能のterminfoデータベースを照会して、ラインエディタをすべてのデバイスで正しく実行できます(正しいエスケープシーケンスを送信してキーを正しく識別します)。端末。
readlineがなぜ静的にリンクされているのかについては、同じ人が一緒に開発し、に含まれていることを覚えておく必要がありますbash
。readline
bash
bash
bash
システムにインストールされているバージョンへのリンクを構築することは可能ですlibreadline
が、バージョンが互換性のあるバージョンであり、これがデフォルト以外の場合にのみ可能です。configure
コンパイル時に使用する必要があります--with-installed-readline
。
答え2
bash
は用語キャップアプリケーションreadline
、良いscreen
と他のプログラムを介して。ほとんどのLinuxベースのシステム(Slackwareを除く)では、おそらくncursesを基本的な実装として考えています。用語キャップ。
これマニュアルページtgetent
(名前付きcurs_termcapそれがSVr4で行われる方法なので...)は次のように言いました:
これらのルーチンは、以下を使用するプログラムの変換補助ツールとして含まれます。用語キャップ図書館。対応するパラメーターは同じで、ルーチンは以下を使用してシミュレートされます。用語情報 データベース。したがって、アイテムの機能を照会するためにのみ使用できます。用語情報アイテムがコンパイルされました。
つまり、呼び出し元プログラムが返されたデータを詳しく見ずに、代わりに従来のtermcapインターフェースを使用して端末の説明を読み取ってデータを画面に書き込むと、生のtermcapのように動作します。
ほとんどのtermcapアプリケーションはあまり慎重に見えません(xtermはまれな例外です)。FAQを見る)。したがって、bash
ncursesで使用できます。
しかし、termcapライブラリはncursesよりも小さいです。これはずっと前から重要だったし、1997年から--with-termlib
ncursesには、上位レベルのcursライブラリに必要な機能とは別に、termcapおよびterminfo固有の部分をライブラリに構築する設定オプションがあります。数年が経つにつれて、一部のLinuxベースのディストリビューションはそれをパッケージに統合しました。
bash
カース関数(libncursesなど)を使用しないためlibtinfo
。
readline
termcap 特定の部分ですbash
(実際に最初に触れたとき、bash
termcap の部分は次のようになります。ハードコーディング、公式ソースはtermcapを使用しますが、おそらくより多くのバイトを節約するために)。bash
バンドルビルドを使用するときは、バンドルをreadline
(クラッシュする可能性のある)共有ライブラリとしてインストールすることはreadline
意味がないため、それを別のライブラリとして扱うことはありません。readline
しかし、(システムに応じて)libtinfo
ncursesは両方とも1つの方法(分割するかどうか)で構築されるため、これを見ることができます。