更改 bashrc 脚本中的 $TERMINFO

更改 bashrc 脚本中的 $TERMINFO

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

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

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

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

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

答案1

因此,在深入研究之后,我发现了发生了什么。 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)

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

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

答案2

来自man bash- 调用部分:

当 bash 作为交互式登录 shell 或带有 --login 选项的非交互式 shell 被调用时,它首先从文件 /etc/profile 中读取并执行命令(如果该文件存在)。读取该文件后,它会按顺序查找 ~/.bash_profile、~/.bash_login 和 ~/.profile,并从第一个存在且可读的文件中读取并执行命令。

要设置您的环境,请在 或 中包含该行terminfo(以及您想要设置的任何其他环境变量)。.bash_profile.profile

看到这个超级用户答案以获取更多详细信息

答案3

.bashrcbash 仅在启动时读取。

所以你需要source ~/.bashrc在当前会话中重新加载它。

相关内容