Fügen Sie zusätzliche Dateien in .bashrc ein

76

Ich habe einige Dinge, die ich in .bashrc ausführen möchte, die ich lieber in einer anderen Datei auf dem System haben würde. Wie kann ich diese Datei in .bashrc aufnehmen?

Fragsworth
quelle
Sollte diese Frage auf Unix & Linux Stack Exchange veröffentlicht werden?
Cale Sweeney

Antworten:

117

Fügen Sie source /whatever/file(oder . /whatever/file) hinzu, .bashrcwo die andere Datei enthalten sein soll.

Jeremiah Willcock
quelle
21
Sie sollten mit Nichtexistenz anmutig umgehen. Überprüfen Sie beispielsweise entweder die Existenz (test -r Pfad &&. Pfad) oder ignorieren Sie Fehler (. Pfad 2> / dev / null)
William Pursell
2
@ William Pursell IMO ist es einfacher, einmal zu testen, als Code für Fälle zu schreiben, in denen 99,99% nie vorkommen.
Daniel
5
@ Daniel Ich bin anderer Meinung. Dinge, die in 0,01% der Fälle passieren, können tausende Male pro Sekunde auftreten. Und ein .bashrc auf einem NFS-gemounteten $ HOME könnte bedeuten, dass die Fehlerrate beim Beschaffen einer Datei viel höher als 0,01% ist
William Pursell
59

Um Fehler zu vermeiden, müssen Sie zuerst überprüfen, ob die Datei vorhanden ist. Dann Quelle der Datei. Mach so etwas.

# include .bashrc if it exists
if [ -f $HOME/.bashrc_aliases ]; then
    . $HOME/.bashrc_aliases
fi
Nick
quelle
3
auch am Ende der .bashrc_aliases oder einer anderen Datei, die ich beschaffe, gebe ich eine Anweisung wie echo "Aliases geladen" aus
Nick
2
Ich dachte mir: "~ ist $ HOME, richtig?" Leider if [ -f ~/.bashrc_aliases ];funktioniert nicht.
modle13
7

Hier ist ein Einzeiler!

[ -f $HOME/.bashrc_aliases ] && . $HOME/.bashrc_aliases

Lustige Tatsache: Shell (und die meisten anderen Sprachen) sind faul. Wenn es eine Reihe von Bedingungen gibt, die durch eine Konjunktion (aka "und" aka &&) verbunden sind, beginnt die Auswertung von links nach rechts. In dem Moment, in dem eine der Bedingungen falsch ist, werden die restlichen Ausdrücke nicht ausgewertet, wodurch andere Ausdrücke effektiv "kurzgeschlossen" werden.

Sie können also einen Befehl, den Sie ausführen möchten, rechts neben eine Bedingung stellen. Er wird erst ausgeführt, wenn jede Bedingung links als "wahr" bewertet wird.

Andrew Allbright
quelle
2

Wenn Sie mehrere Dateien laden möchten, die möglicherweise vorhanden sind oder nicht, können Sie sie mithilfe einer for-Schleife etwas elegant halten.

files=(somefile1 somefile2)
path="$HOME/path/to/dir/containing/files/"
for file in ${files[@]}
do 
    file_to_load=$path$file
    if [ -f "$file_to_load" ];
    then
        . $file_to_load
        echo "loaded $file_to_load"
    fi
done

Die Ausgabe würde folgendermaßen aussehen:

$ . ~/.bashrc
loaded $HOME/path/to/dir/containing/files/somefile1
loaded $HOME/path/to/dir/containing/files/somefile2
modle13
quelle
Sicherlich müssen Sie in der Schleife nicht erneut nach Dateien suchen? (Es sei denn, Sie haben eine sehr dynamische Liste von Dateien auf der Festplatte)
John Mark Scarborough
Es gibt nur eine Überprüfung auf Dateidexistenz. Wenn in Ihrer aktuellen Arbeitsumgebung die in der Liste beschriebene Datei nicht vorhanden ist, tritt beim Laden der Datei einfach ein Fehler auf und es entstehen visuelle Störungen. Ein idealer Ansatz wäre, eine Liste von Dateien abzurufen und diese dann zu durchlaufen, anstatt eine statische Liste zu definieren.
modle13
0

Ich bevorzuge es, zuerst die Version zu überprüfen und eine Variable für die Pfadkonfiguration zuzuweisen:

if [ -n "${BASH_VERSION}" ]; then
  filepath="${HOME}/ls_colors/monokai.sh"
  if [ -f "$filepath" ]; then
    source "$filepath"
  fi
fi
Nick Tsai
quelle