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