Ich verwende einen zentralen Speicherort für meine Bashrc und stelle diese für alle meine Benutzer folgendermaßen bereit:
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
Und jetzt möchte ich dasselbe mit meiner inputrc-Datei machen. Ich habe bereits herausgefunden, wie man das Äquivalent zu source in inputrc macht vondiese Frage:
$include /path/to/global/inputrc
Aber die Sache ist, dass ich wie in der obigen Bashrc eine Fehlerbehandlung möchte, ich möchte die Datei nur laden, wenn sie tatsächlich existiert. Daher lautet meine Frage: Wie gebe ich eine if-Anweisung an, die prüft, ob in meiner Inputrc eine Datei existiert?
Antwort1
Sie müssen nicht $include
von Ihrem Computer aus ~/.inputrc
eine inputrc-Datei lesen, da Sie diese jederzeit mit
bind -f /path/to/global/inputrc
if [ -r file ]
Verwenden Sie hierfür also Ihr übliches Modell anstelle von source
.
Die Manpage für besagt, dass bei einer interaktiven Login-Shell /etc/profile
und der erste gefundene Wert von ~/.bash_profile
, ~/.bash_login
, und gelesen wird ~/.profile
. Bei anderen interaktiven Shells liest es ~/.bashrc
, und bei nicht-interaktiven liest es die Datei, $BASH_ENV
falls vorhanden.
In Ihrem Fall verwenden Sie vermutlich eine interaktive Shell ohne Anmeldung für einen Terminalemulator, daher ~/.bashrc
wird Folgendes gelesen. Sie können sehen, was passiert, wenn Sie strace
ein Dummy-Home verwenden, z. B. in /tmp
.
$ touch /tmp/.inputrc /tmp/.bashrc
$ (unset BASH_ENV INPUTRC HISTFILE
HOME=/tmp strace -e open -o /tmp/out bash -i)
Hier wird das Öffnen der folgenden Dateien angezeigt (der Übersichtlichkeit halber habe ich einige entfernt):
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 liest also .inputrc
nach .bashrc
. Das ist sinnvoll, da Sie so Zeit haben, INPUTRC
Ihre Datei einzustellen.
Antwort2
Anstatt dies in der .inputrc
Datei zu tun (soweit ich weiß, gibt es dort keine Möglichkeit zu prüfen, ob die Datei tatsächlich existiert), können Sie die INPUTRC
Umgebungsvariable in Ihrer .bashrc
Datei festlegen:
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
Die INPUTRC
Variable ist im readline
Handbuch (und auch im bash
Handbuch) dokumentiert.