Измените $TERMINFO в скрипте bashrc

Измените $TERMINFO в скрипте bashrc

Я пытаюсь установить TERMINFO="$HOME/.terminfo"в своем .bashrcскрипте. Причина в том, что мой терминал не находится в системном terminfoрасположении, и поэтому его terminfoфайл находится в моем домашнем каталоге.
Проблема в том, что изменение не вступает в силу для текущей оболочки, только для подоболочек. Я предполагаю, что это происходит из-за того, что readline инициализируется до того, как bash прочитает файл .bashrc.

Так есть ли способ решить эту проблему? Возможно, есть способ повторно инициализировать readline, чтобы изменения $TERMINFOвступили в силу?
Я пытаюсь избежать выполнения exec bashafter setting, так как тогда мне нужно убедиться, что я не попаду в цикл re-exec, а это просто уродливо (хотя выполнение exec bashafter setting работает).

EDIT: Этонетпроблема с запуском скрипта. Я точно знаю, что .bashrcскрипт запускается и что $TERMINFOон задается. Запуск echo $TERMINFOпосле завершения запуска оболочки показывает правильное значение.

EDIT2: Похоже, это может быть связано с версией библиотеки bash или readline. Я не могу повторить проблему с bash-4.2.20 и readline-6.2_p1, но могу с bash-3.2 и readline-5.1.3.

«Нет» — приемлемый ответ, если это невозможно. Но было бы неплохо узнать, что происходит, что заставляет ответить «нет».

решение1

Итак, покопавшись еще немного, я нашел, что происходит. Сборка bash RHEL5 вообще не использует terminfo (почему, кто знает, это же Red Hat), она использует termcap. Однако, по-видимому, на коробке есть другой bash, который использует terminfo. Вот почему подоболочки и повторное выполнение будут работать, так как они будут использовать другой bash, а не тот, что по умолчанию. Я чувствую себя глупо, что не заметил этого.

Это можно определить, сравнив две команды:

# 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, когда почти все остальные в мире отказались от него, не имеет смысла, но вот так.

решение2

Из man bashраздела призыва:

Когда bash вызывается как интерактивная оболочка входа или как неинтерактивная оболочка с опцией --login, он сначала считывает и выполняет команды из файла /etc/profile, если этот файл существует. После считывания этого файла он ищет ~/.bash_profile, ~/.bash_login и ~/.profile в указанном порядке и считывает и выполняет команды из первой существующей и доступной для чтения.

Чтобы настроить среду, включите terminfoстроку (и любые другие переменные среды, которые вы хотите задать) в файл .bash_profileили .profile.

Видеть этоОтвет суперпользователя для получения более подробной информации.

решение3

bash читает только .bashrcпри запуске.

Поэтому вам нужно source ~/.bashrcперезагрузить его в текущем сеансе.

Связанный контент