Я пытаюсь установить TERMINFO="$HOME/.terminfo"
в своем .bashrc
скрипте. Причина в том, что мой терминал не находится в системном terminfo
расположении, и поэтому его terminfo
файл находится в моем домашнем каталоге.
Проблема в том, что изменение не вступает в силу для текущей оболочки, только для подоболочек. Я предполагаю, что это происходит из-за того, что readline инициализируется до того, как bash прочитает файл .bashrc
.
Так есть ли способ решить эту проблему? Возможно, есть способ повторно инициализировать readline, чтобы изменения $TERMINFO
вступили в силу?
Я пытаюсь избежать выполнения exec bash
after setting, так как тогда мне нужно убедиться, что я не попаду в цикл re-exec, а это просто уродливо (хотя выполнение exec bash
after 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
перезагрузить его в текущем сеансе.