bashrcスクリプトで$ TERMINFOを変更する

bashrcスクリプトで$ TERMINFOを変更する

TERMINFO="$HOME/.terminfo"私のスクリプトでこれを設定しようとしています.bashrc。その理由は、私の端末がシステムterminfoの場所にないので、terminfo私のホームディレクトリにそのファイルがあるからです。
ここでの問題は、変更が現在のシェルには適用されず、サブシェルにのみ適用されることです。私はこれがbashがファイルを読む前にreadlineが初期化されるからだと思います.bashrc

それでは、この問題を解決する方法はありませんか?変更を$TERMINFO適用するためにreadlineを再初期化する方法はありますか?設定後はこれを
避けたいと思います。exec bashなぜなら、再実行ループに陥らないようにしなければならないからです。これは醜いことです(exec bash設定後に実行すると機能しますが)。

編集:これいいえスクリプトの実行中に問題が発生しました。.bashrcスクリプトが実行中で$TERMINFO設定中であることがわかります。echo $TERMINFOシェルの起動が完了した後に実行すると、正しい値が表示されます。

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があるようです。これがデフォルトのbash以外のbashを使用するため、サブシェルとREDOが機能する理由です。私はこれに気づかなかったのは愚かな感じがしました。

これは、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)

1つはlibtermcapに関連付けられ、もう1つはlibncursesに関連付けられています。

ここでは、RHELを使用していることを指定する必要があります。これは明らかに重要な要素だからです。世界中のほとんどの人がtermcapを捨てていますが、彼らがなぜtermcapを使うのかはわかりませんが、それはまさにそれです。

答え2

発信者man bash- 通話相手:

bashが--loginオプションを使用して対話型ログインシェルまたは非対話型シェルとして呼び出されると、まず/ etc / profileファイル(ファイルがある場合)からコマンドを読み取り、実行します。ファイルを読み込んだら、~/.bash_profile、~/.bash_login、~/.profile を順番に探して、存在して読み取れる最初のファイルからコマンドを読み込んで実行します。

環境を設定するには、terminfo設定したい他の環境変数と一緒にこの行をまたはに含めます。.bash_profile.profile

これを見て詳細はスーパーユーザーの回答

答え3

.bashrcBashは起動時にのみ読みます。

source ~/.bashrcしたがって、現在のセッションから再ロードする必要があります。

関連情報