Я использую центральное расположение для своего bashrc и источника, который доступен всем моим пользователям, например так:
GLOBAL_BASHRC="/path/to/global/bashrc"
if [ -r "$GLOBAL_BASHRC" -a -f "$GLOBAL_BASHRC" ]; then
# Load the bashrc
source $GLOBAL_BASHRC
else
echo "Warning: Bashrc file [${GLOBAL_BASHRC}] does not exist!"
fi
И теперь я хочу сделать то же самое для моего файла inputrc. Я уже узнал, как сделать эквивалент источника в inputrc изэтот вопрос:
$include /path/to/global/inputrc
Но дело в том, что, как и в bashrc выше, мне нужна какая-то обработка ошибок, я хочу загружать файл только в том случае, если он действительно существует. Поэтому мой вопрос в том, как мне указать оператор if, проверяющий, существует ли файл в моем inputrc?
решение1
Вам не нужно $include
из вашего, ~/.inputrc
так как вы можете прочитать файл inputrc в любое время с помощью
bind -f /path/to/global/inputrc
так что используйте свой обычный вариант if [ -r file ]
вместо source
.
На странице руководства для интерактивной оболочки входа в систему говорится, что она считывает /etc/profile
и первый найденный из ~/.bash_profile
, ~/.bash_login
, и ~/.profile
. Для других интерактивных оболочек она считывает ~/.bashrc
, а для неинтерактивных — файл, $BASH_ENV
если таковой имеется.
В вашем случае, вероятно, вы используете интерактивную оболочку без входа в систему для эмулятора терминала, поэтому ~/.bashrc
читается. Вы можете увидеть, что происходит, используя strace
и фиктивный дом, например, в /tmp
.
$ touch /tmp/.inputrc /tmp/.bashrc
$ (unset BASH_ENV INPUTRC HISTFILE
HOME=/tmp strace -e open -o /tmp/out bash -i)
Здесь показаны следующие открывающиеся файлы (некоторые я удалил для краткости):
open("/tmp/.bashrc", O_RDONLY) = 3
open("/tmp/.bash_history", O_RDONLY) = -1 ENOENT
open("/tmp/.inputrc", O_RDONLY) = 3
open("/tmp/.bash_history", O_WRONLY|O_CREAT|O_TRUNC, 0600) = 3
Так что bash будет читать .inputrc
после .bashrc
. Это имеет смысл, так как дает вам время для установки INPUTRC
в вашем файле.
решение2
Вместо того, чтобы делать это в .inputrc
файле (в котором, насколько мне известно, нет возможности проверить, существует ли файл на самом деле), вы можете задать INPUTRC
переменную окружения в своем .bashrc
файле:
if [ -r "$GLOBAL_BASHRC" -a -f "$GLOBAL_BASHRC" ]; then
# Load the bashrc
source $GLOBAL_BASHRC
if [ -f /path/to/global/inputrc ]; then
export INPUTRC="/path/to/global/inputrc"
fi
else
echo "Warning: Bashrc file [${GLOBAL_BASHRC}] does not exist!"
fi
Переменная INPUTRC
задокументирована в readline
руководстве (и в bash
руководстве тоже).