TERMINFO="$HOME/.terminfo"
スクリプト内で設定しようとしています.bashrc
。その理由は、ターミナルがシステムのterminfo
場所にないため、そのterminfo
ファイルをホーム ディレクトリに置いているからです。
ここでの問題は、変更が現在のシェルには適用されず、サブシェルにのみ適用されることです。これは、bash がファイルを読み取る前に readline が初期化されているためだと思います.bashrc
。
$TERMINFO
では、この問題を解決する方法はあるのでしょうか? 変更が有効になるように readline を再初期化する方法があるのでしょうか? 設定後に
を実行するのは避けようとしていますexec bash
。再実行ループに陥らないようにする必要があり、これは単に見苦しいからです (exec bash
設定後に実行しても機能しますが)。
編集:これはない.bashrc
スクリプトの実行中に問題が発生しました。スクリプトが実行され、それが$TERMINFO
設定されていることは事実です。echo $TERMINFO
シェルの起動が完了した後に実行すると、正しい値が表示されます。
編集2: これは 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 を使用するためです。これに気付かなかった自分が愚かだと感じています。
これは、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 を放棄しているのに、なぜ termcap を使用するのかは意味不明ですが、それが現実です。
答え2
man bash
呼び出しセクションから:
bash が対話型ログイン シェルとして呼び出されるか、--login オプション付きの非対話型シェルとして呼び出されると、/etc/profile ファイルが存在する場合は、最初にそのファイルからコマンドを読み取って実行します。そのファイルを読み取った後、~/.bash_profile、~/.bash_login、~/.profile をこの順序で探し、最初に存在し読み取り可能なファイルからコマンドを読み取って実行します。
環境を設定するには、または のterminfo
いずれかに行 (および設定するその他の環境変数)を含めます。.bash_profile
.profile
答え3
bash は.bashrc
起動時にのみ読み取ります。
source ~/.bashrc
したがって、現在のセッションで再ロードする必要があります。