更改 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在當前會話中重新加載它。

相關內容