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
.bashrc
Bashは起動時にのみ読みます。
source ~/.bashrc
したがって、現在のセッションから再ロードする必要があります。