Bash

在 bashrc 腳本中更改 $TERMINFO

  • May 19, 2018

我正在嘗試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。這就是為什麼 subshel​​l 和重新執行會起作用的原因,因為它們會使用另一個 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 是沒有意義的,但它確實存在。

引用自:https://unix.stackexchange.com/questions/36186