Declaração if em inputrc

Declaração if em inputrc

Estou usando um local central para meu bashrc e fonte para todos os meus usuários assim:

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

E agora quero fazer a mesma coisa com meu arquivo inputrc. Já descobri como fazer o equivalente ao source no inputrc doessa questão:

$include /path/to/global/inputrc

Mas o problema é que, como no bashrc acima, eu quero algum tratamento de erros, só quero carregar o arquivo se ele realmente existir. Portanto, minha pergunta é: como especifico uma instrução if para verificar se existe um arquivo em meu inputrc?

Responder1

Você não precisa fazer $includeisso, ~/.inputrcpois você pode ler um arquivo inputrc a qualquer momento com

bind -f /path/to/global/inputrc

então use o seu habitual if [ -r file ]com isso em vez de source.


A página de manual diz para um shell de login interativo que ele lê /etc/profile e o primeiro encontrado de ~/.bash_profile, ~/.bash_logine ~/.profile. Para outros shells interativos, ele lê ~/.bashrce, para não interativos, lê o arquivo, $BASH_ENVse houver.

No seu caso, presumivelmente, você está usando um shell interativo sem login para um emulador de terminal, portanto ~/.bashrcé lido. Você pode ver o que acontece usando straceuma casa fictícia, por exemplo, em /tmp.

$ touch /tmp/.inputrc /tmp/.bashrc
$ (unset BASH_ENV INPUTRC HISTFILE
   HOME=/tmp strace -e open -o /tmp/out bash -i)

Isso mostra os seguintes arquivos sendo abertos (removi alguns por questões de brevidade):

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

Então o bash será lido .inputrcdepois .bashrc. Isso faz sentido, pois lhe dá tempo para definir INPUTRCseu arquivo.

Responder2

Em vez de fazer isso no .inputrcarquivo (que não possui nenhum recurso para verificar se o arquivo realmente existe no AFAIK), você pode definir a INPUTRCvariável de ambiente em seu .bashrcarquivo:

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

A INPUTRCvariável está documentada no readlinemanual (e no bashmanual também).

informação relacionada