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 $include
isso, ~/.inputrc
pois 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_login
e ~/.profile
. Para outros shells interativos, ele lê ~/.bashrc
e, para não interativos, lê o arquivo, $BASH_ENV
se 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 strace
uma 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 .inputrc
depois .bashrc
. Isso faz sentido, pois lhe dá tempo para definir INPUTRC
seu arquivo.
Responder2
Em vez de fazer isso no .inputrc
arquivo (que não possui nenhum recurso para verificar se o arquivo realmente existe no AFAIK), você pode definir a INPUTRC
variável de ambiente em seu .bashrc
arquivo:
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 INPUTRC
variável está documentada no readline
manual (e no bash
manual também).