web-dev-qa-db-ja.com

使用しているreadlinebashのバージョンを確認するにはどうすればよいですか?

Bashセッションで使用しているreadlineのバージョンを確認するにはどうすればよいですか?

私はreadlineライブラリ6.3を持っているように見えるので、特に疑問に思っていますが、set enable-bracketed-paste on私の.inputrcは機能していますが、その機能はreadline7.0でのみ追加されました。

MacOS 10.11(Finkと共にインストール)でbash4.4.0を使用しています。

4
asmeurer

静的にリンクされたライブラリのバージョンを決定する 一般的に信頼できる方法はありません があります。ただし、この場合、rl_readline_versionグローバル変数の値を使用できると思います。

readline.hは、整数として扱われるべきCプリプロセッサ変数RL_READLINE_VERSIONを定義します。これは、インストールされているReadlineのバージョンに応じてアプリケーションコードを条件付きでコンパイルするために使用できます。値は、ライブラリのメジャーバージョン番号とマイナーバージョン番号の16進エンコードで、形式は0xMMmmです。 [〜#〜] mm [〜#〜]は2桁のメジャーバージョン番号です。 mmは2桁のマイナーバージョン番号です。たとえば、Readline 4.2の場合、RL_READLINE_VERSIONの値は0x0402になります。

https://tiswww.case.edu/php/chet/readline/readline.html#SEC25

Bash-2.05a以降では、次のようにrl_readline_versionとして公開されています。

int rl_readline_version = RL_READLINE_VERSION;

https://git.savannah.gnu.org/cgit/bash.git/tree/NEWS?id=d233b485e83c3a784b803fb894280773f16f2deb#n1542

これを確認するために私が知っている最も簡単な方法は gdbのようなデバッガーを使用 です。例えば:

$ gdb bash
(gdb) print /x (int) rl_readline_version
$1 = 0x700

これは、私のバージョンのbashがreadlineバージョン7.0を実行していることを意味します。

興味がある場合は、readlineメンテナーがMac OSXでの静的リンクの理由をここで説明しています。

  1. Mac OSXに含まれているreadlineおよび履歴ライブラリの静的バージョンに対してシェルリンクを確実にするための特別な処理があります。 Appleは、標準ライブラリとして不十分な動的libreadlineおよびlibhistory「置換」を出荷します。

https://tiswww.case.edu/php/chet/bash/NOTES

readlineはMacOS Xで静的にリンクされているため、lddotoolは役に立ちません。ただし、完全を期すために、Linuxでどのように表示されるかを示します。 Ubuntu18.04での私の外観は次のとおりです。

$ ldd /bin/bash
    linux-vdso.so.1 (0x00007ffeb83c3000)
    libtinfo.so.5 => /lib/x86_64-linux-gnu/libtinfo.so.5 (0x00007fbcd7d57000)
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fbcd7b53000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fbcd7762000)
    /lib64/ld-linux-x86-64.so.2 (0x00007fbcd829b000)

ご覧のとおり、この場合、ldd出力も役に立ちません。代わりにstraceを使用しました。

$ strace -o strace.log -f bash
# Have to do stuff with interactive mode; `bash -c exit` won't do it.
$ exit

対応するdtraceコマンドは次のようになると思います。

$ dtrace -o dtrace.log -f bash

まだ試したことがないので、はっきりとは言えません。この時点で、readlineのログファイルをgrepできます。

$ grep readline strace.log
strace.log:30194 openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libreadline.so.7", O_RDONLY|O_CLOEXEC) = 3

したがって、Ubuntu 18.04では、予想どおり、readlineバージョン7です。

$ dlocate -F '/lib/x86_64-linux-gnu/libreadline.so.7'
libreadline7:AMD64: /lib/x86_64-linux-gnu/libreadline.so.7.0
libreadline7:AMD64: /lib/x86_64-linux-gnu/libreadline.so.7
$ apt-cache policy libreadline7
libreadline7:
  Installed: 7.0-3
  Candidate: 7.0-3
  Version table:
 *** 7.0-3 500
        500 http://us.archive.ubuntu.com/ubuntu bionic/main AMD64 Packages
        100 /var/lib/dpkg/status
1