TERMINFO="$HOME/.terminfo"
我正在尝试在我的脚本中进行设置.bashrc
。原因是我的终端不在系统terminfo
位置,所以terminfo
我的主目录中有它的文件。
这里的问题是更改不会对当前 shell 生效,仅对子 shell 生效。我猜这是因为 readline 在 bash 读取文件之前被初始化.bashrc
。
那么有没有办法解决这个问题呢?也许有某种方法可以重新初始化 readline 以使更改$TERMINFO
生效?
我试图避免exec bash
在设置后进行操作,因为那样我必须确保不会陷入重新执行循环,而这很丑陋(尽管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 重复该问题。
如果不可能的话,“不”是可以接受的答案。但很高兴知道到底发生了什么导致答案为“否”。
答案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
.bashrc
bash 仅在启动时读取。
所以你需要source ~/.bashrc
在当前会话中重新加载它。