Если оператор в inputrc

Если оператор в inputrc

Я использую центральное расположение для своего 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руководстве тоже).

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