在 bashrc 脚本中更改 $TERMINFO

phe*_*mer 6 bash terminal readline

我正在尝试TERMINFO="$HOME/.terminfo"在我的.bashrc脚本中进行设置。原因是我的终端不在系统terminfo位置,所以terminfo我的主目录中有它的文件。
这里的问题是更改不会对当前 shell 生效,只对子 shell 生效。我猜这是因为 readline 在 bash 读取.bashrc文件之前被初始化。

那么有没有办法解决这个问题呢?也许某种方法可以重新初始化 readline 以使更改$TERMINFO生效?
我试图避免exec bash在设置后执行,因为那样我必须确保我不会以 re-exec 循环结束,这很丑陋(尽管exec bash在设置后执行它确实有效)。

编辑:这不是运行脚本的问题。我知道.bashrc脚本正在运行并且$TERMINFO正在设置的事实。echo $TERMINFO在 shell 完成启动后运行会显示正确的值。

EDIT2:看来这可能与 bash 或 readline 库版本相关。我不能用 bash-4.2.20 和 readline-6.2_p1 复制这个问题,但我可以用 bash-3.2 和 readline-5.1.3。

如果不可能,“否”是可以接受的答案。但是很高兴知道发生了什么导致答案为“不”。

phe*_*mer 4

因此,在深入研究之后,我发现了发生了什么。RHEL5 的 bash 构建根本不使用 terminfo(为什么,谁知道,它是 Red Hat),它使用 termcap。然而,盒子上显然还有另一个使用 terminfo 的 bash。这就是为什么子 shell 和重新执行会起作用,因为它们将使用另一个 bash,而不是默认的 bash。我因为没有注意到这一点而感到愚蠢。

这可以通过比较 2 个命令来确定:

# ldd "$BASH"
    linux-vdso.so.1 =>  (0x00007fff4f1fd000)
    libtermcap.so.2 => /lib64/libtermcap.so.2 (0x0000003e0bc00000)
    libdl.so.2 => /lib64/libdl.so.2 (0x0000003e07000000)
    libc.so.6 => /lib64/libc.so.6 (0x0000003e06c00000)
    /lib64/ld-linux-x86-64.so.2 (0x0000003e06800000)

# ldd `which bash`
    linux-vdso.so.1 =>  (0x00007fff643fd000)
    libncurses.so.5 => /usr/lib64/libncurses.so.5 (0x0000003e0d800000)
    libdl.so.2 => /lib64/libdl.so.2 (0x0000003e07000000)
    libc.so.6 => /lib64/libc.so.6 (0x0000003e06c00000)
    /lib64/ld-linux-x86-64.so.2 (0x0000003e06800000)
Run Code Online (Sandbox Code Playgroud)

注意到一个与 libtermcap 链接,另一个与 libncurses 链接。

我应该指定我在这里使用 RHEL,因为这显然是关键因素。为什么他们在世界上几乎所有其他人都放弃了 termcap 的情况下使用 termcap,这毫无意义,但事实就是如此。