在 bashrc 腳本中更改 $TERMINFO
我正在嘗試
TERMINFO="$HOME/.terminfo"
在我的.bashrc
腳本中進行設置。原因是我的終端不在系統terminfo
位置,所以我的terminfo
主目錄中有它的文件。這裡的問題是更改不會對目前 shell 生效,僅對子 shell 生效。我猜這是因為在 bash 讀取
.bashrc
文件之前正在初始化 readline。那麼有沒有辦法解決這個問題呢?也許某種方式可以重新初始化 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 複製這個問題。
如果不可能,“否”是一個可以接受的答案。但是很高興知道發生了什麼導致答案為“否”。
所以在探勘了更多之後,我發現了發生了什麼。RHEL5 的 bash 建構根本不使用 terminfo(為什麼,誰知道,它是 Red Hat),它使用 termcap。但是,顯然還有另一個使用 terminfo 的 bash。這就是為什麼 subshell 和重新執行會起作用的原因,因為它們會使用另一個 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 是沒有意義的,但它確實存在。