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を使うのかはわかりませんが、それはまさにそれです。

おすすめ記事