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?


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.


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

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.


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

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.