我如何确定 bash 正在使用哪个版本的 readline?

我如何确定 bash 正在使用哪个版本的 readline?

我如何确定我在 bash 会话中使用哪个版本的 readline?

我特别想知道,因为我似乎有 readline 库 6.3,但是set enable-bracketed-paste on我的.inputrc正在运行,即使该功能仅在 readline 7.0 中添加。

我在 macOS 10.11 上使用 bash 4.4.0(使用 Fink 安装)。

答案1

没有普遍可靠的方法确定静态链接库的版本。但是,在这种情况下,我相信您可以使用rl_readline_version全局变量的值。

readline.h定义一个应被视为整数的 C 预处理器变量,RL_READLINE_VERSION可用于根据安装的 Readline 版本有条件地编译应用程序代码。该值是库的主版本号和次版本号的十六进制编码,格式为 0x嗯嗯毫米是两位数的主版本号;毫米是两位数的次版本号。例如,对于 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 OS X 上进行静态链接的原因:

  1. 有特殊处理来确保 shell 链接到 Mac OS X 上包含的 readline 和 history 库的静态版本;Apple 提供了不充分的动态 libreadline 和 libhistory“替代品”作为标准库。

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

由于readline在 Mac OS X 上是静态链接的,ldd因此otool不会有帮助。但是,为了完整起见,我将向您展示它在 Linux 上的样子。这是我在 Ubuntu 18.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

但我还没有尝试过,所以我不能肯定地说。此时,我只能 grep 日志文件readline

$ 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

答案2

gdb -quiet -ex 'print /x (int) rl_readline_version' -ex 'quit' bash
# Outputs: $1 = 0x602 (Readline Version 6.02)

这减少了nathaniel-m-beaver 答案

答案3

不确定你对使用 fink 有多大热情,但还有另一个适用于 macOS 的包管理器,它叫做 homebrew,可以在这里http://brew.sh它允许您运行较新版本的程序,如 BASH 等等。

安装 homebrew

相关内容