If-Anweisung in inputrc

If-Anweisung in inputrc

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 $includevon Ihrem Computer aus ~/.inputrceine 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_ENVfalls vorhanden.

In Ihrem Fall verwenden Sie vermutlich eine interaktive Shell ohne Anmeldung für einen Terminalemulator, daher ~/.bashrcwird Folgendes gelesen. Sie können sehen, was passiert, wenn Sie straceein 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 .inputrcnach .bashrc. Das ist sinnvoll, da Sie so Zeit haben, INPUTRCIhre Datei einzustellen.

Antwort2

Anstatt dies in der .inputrcDatei zu tun (soweit ich weiß, gibt es dort keine Möglichkeit zu prüfen, ob die Datei tatsächlich existiert), können Sie die INPUTRCUmgebungsvariable in Ihrer .bashrcDatei 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 INPUTRCVariable ist im readlineHandbuch (und auch im bashHandbuch) dokumentiert.

verwandte Informationen