Warum läuft .bashrc nicht automatisch?

202

Ich habe einige Alias-Befehle in meine .bashrcDatei eingefügt, damit sie möglicherweise jedes Mal geladen werden, wenn ich ein neues Terminal-Fenster öffne. Das passiert aber nicht.

Ich muss run script:im Terminal> Preferences> " MyDefaultTheme "> Shell Prefpane auswählen und hinzufügen: source .bashrc && cleardamit es funktioniert ...

Dies scheint seltsam, da viele Tutorials nur sagen, dass Sie nur die .bashrcDatei hinzufügen müssen und alles in Ordnung ist.

Beachten Sie, dass ich bashbei der Verwendung des Terminals nicht einlaufe. Ich mag das andere (Standard) (ich weiß nicht, was es ist) besser, weil es mir zeigt, wo ich die ganze Zeit bin. Beispiel:

>>d54c6b47b:~ romeo$

anstatt:

>>bash$

In der Bash wird alles geladen, wie es sein sollte.

Meine Frage ist also, warum meine .bashrcDatei nicht automatisch geladen wurde und ich jedes Mal die Option zum Aufrufen hinzufügen musste.

Auch ein Tutorial sagte mir, ich solle etwas machen wie:

$alias la=’ls -la >> ~/.bashrc

was den alias an meine schreiben sollte, das .bashrcgeht auch nicht ...

Beachten Sie, dass ich ein UNIX-Neuling bin, seien Sie also vorsichtig.

Romeovs
quelle
Ich denke, das ist sehr nah an apple.stackexchange.com/questions/7984/… .
Boehj
@boehj Nun, es erwähnt "nicht laden .bashrc", aber das war es auch schon.
Jari Keinänen
OK, tut mir leid, wenn ich die Dinge hier verwechselt habe.
Boehj
Dir gefällt wahrscheinlich csh(oder einer anderen Variante) besser. Aber Sie sollten wissen, dass das >>bash$geändert werden kann :)
vol7ron
Wenn Befehle beim Laden ausgeführt werden sollen , erstellen Sie sie .profilein Ihrem Ausgangsverzeichnis
Kolob Canyon,

Antworten:

94

Fügen Sie das einfach in Ihre .profileDatei aus Ihrem Home-Verzeichnis ein und es sollte funktionieren, wenn Sie das nächste Mal eine neue Shell starten oder nachdem Sie sie ausgeführt habensource ~/.profile

Dieser Link gibt deutlich die Reihenfolge an, in der die Startdateien von der Shell gelesen und geladen werden: http://hayne.net/MacDev/Notes/unixFAQ.html#shellStartup

Cosu
quelle
akzeptierte dieses, weil es eine Lösung hat (und es war das erste von zwei nahezu identischen Beiträgen).
Romeovs
37
Abgestimmt. Ich empfehle, diesen Rat nicht zu befolgen. Das Problem ist, dass Terminal Anmeldeshells erstellt und Bash-Anmeldeshells nur das Anmeldestartskript ausführen, nicht ~/.bashrc. Die Lösung besteht jedoch nicht darin, Ihren .bashrcInhalt einfach in die Anmeldestartdatei einzufügen, da diese beiden Dateien unterschiedliche Setup-Typen ausführen sollen. Stattdessen ist die kanonische Setup für Bash Ihre haben ~/.bash_profileQuelle Ihres ~/.bashrczu einem geeigneten Punkt im Skript (dauert in der Regel).
Chris Seite
Ich sehe keinen anderen identischen Beitrag, der nur in der sh-Datei steht
Mark
218

Kenne ich schon. Was mir aufgefallen ist, dass OS X .bashrcbeim Bash-Start keine Dateien liest . Stattdessen werden die folgenden Dateien gelesen (in der folgenden Reihenfolge):

  1. /etc/profile
  2. ~/.bash_profile
  3. ~/.bash_login
  4. ~/.profile

Siehe auch Chris Johnsens informativen und nützlichen Kommentar:

Standardmäßig startet Terminal die Shell über /usr/bin/login, wodurch die Shell zu einer Anmeldeshell wird. Auf jeder Plattform (nicht nur Mac OS X) bash verwendet nicht .bashrcfür Login - Shells (nur /etc/profileund die ersten .bash_profile, .bash_login, .profiledass existiert und lesbar ist ). Dies ist der Grund, warum "Put source ~/.bashrcin Your .bash_profile" die Standardempfehlung ist

Ich setze normalerweise nur die Dinge ein, die ich normalerweise getan ~/.bashrchabe ~/.profile- hat bisher wie ein Zauber gewirkt.

Jari Keinänen
quelle
38
Standardmäßig startet Terminal die Shell über /usr/bin/login, wodurch die Shell zu einer Anmeldeshell wird. Auf jeder Plattform (nicht nur Mac OS X) bash verwendet nicht .bashrcfür Login - Shells (nur /etc/profileund die ersten .bash_profile, .bash_login, .profiledass existiert und lesbar ist ). Dies ist der Grund, warum "Put source ~/.bashrcin Your .bash_profile" eine Standardempfehlung ist.
Chris Johnsen
5
Zu "Ich habe normalerweise nur die Dinge eingefügt, die ich normalerweise in ~ / .bashrc zu ~ / .profile eingefügt habe": Für maximale Kompatibilität empfehle ich, dass Sie den Ratschlägen von Chris Johnsen folgen und alles einfügen, was Sie auf nicht angemeldete Shells anwenden möchten ~ / .bashrc und füge "source ~ / .bashrc" zu deinem ~ / .bash_profil hinzu, um es für Login-Shells auszuführen. Andernfalls funktioniert es nicht für Sub-Shells, oder wenn sich das Terminal ändert, um nicht angemeldete Shells zu erstellen, oder wenn Sie jemals xterm oder ein anderes Terminalprogramm verwenden, das standardmäßig nicht angemeldete Shells erstellt, oder wenn Sie das verwenden möchten gleiche Einrichtung auf einem anderen Betriebssystem.
Chris Seite
4
In Mac OS X sollten Sie in Erwägung ziehen, ~ / .bashrc / etc / bashrc ausführen zu lassen, um globale Verhaltensweisen zu erfassen. Insbesondere befindet sich in / etc / bashrc ein Code zum Aktualisieren des Arbeitsverzeichnisses bei jeder Eingabeaufforderung. Auf diese Weise kann Terminal das Proxy-Symbol anzeigen, neue Terminals im selben Verzeichnis erstellen und das Arbeitsverzeichnis für Resume- und Window-Gruppen wiederherstellen.
Chris Seite
Für mich hat die Beschaffung von .bashrc aus .bash_profile nicht funktioniert. Aber die Beschaffung von .bashrc / .bash_profile aus .profile hat funktioniert.
Ken Russell
2
Schöne Antwort, aber ein bisschen falsch informiert. Ich glaube , dass die Lasten bash Terminal nur eine der ~/.bash_profile, ~/.profile, ~/.bash_login, nie alle der ihnen. Sie können einen einfachen Test ausführen, indem Sie die 3 Dateien erstellen. Es sieht aus wie der Bash - Terminal die Präferenz hat ~/.bash_profile> ~/.bash_login> ~/.profile. Wenn einer von ihnen existiert, werden die weniger bevorzugten übersprungen. Deshalb ist es manchmal empfohlen, auch Quelle ~/.profilein ~/.bash_profile.
Neurite
25

Ich stecke alles in ~/.bashrcund nur source ~/.bashrcin .profile.

Dadurch können Screen- und XTerm-Sitzungen (und ich vermute, TMUX-Sitzungen) meine Umgebung erben, da nur Nicht-Anmeldesitzungen ausgeführt werden .bashrc, während Anmeldesitzungen (z. B. Terminal oder iTerm) nur ausgeführt werden .profile.

anu
quelle
1
Das ist mein Ansatz. Auf diese Weise kann ich eine .bashrc-Datei verwalten, die auf beiden Systemen funktioniert ... und ich kann alle Mac-spezifischen Inhalte oder Inhalte wie Aliase, die nur für die Arbeit bestimmt sind (wo ich den Mac am häufigsten verwende), in meine .bash_profile-Datei einfügen.
Michael Durrant
2
Beachten Sie, dass dies .profilefür mehrere Shells gleich ist und nur POSIX-kompatiblen Shcode enthalten sollte. Wenn es Quellen .bashrcenthält, enthält es möglicherweise Bash-spezifischen Code (die Existenz der .bashrcDatei ist Bash-spezifisch). Ich empfehle Ihnen .profile, Ihre in umzubenennen , .bash_profileda Sie sie auf Bash-spezifische Weise verwenden. Oder, um es generischen Code in .profileund erstellen Sie ein , .bash_profiledass die Quellen .profileund .bashrc.
Chris Seite
19

Es gibt zwei Szenarien:

  1. Sie benutzen Linux
  2. Sie verwenden Mac Os X

Für beide möchten Sie eine Quelle ~/.bashrcin Ihrem Profil erstellen, die geladen oder bezogen wird, wenn Ihre Shell für Ihr Terminal gestartet wird.


LINUX

Wird unter Linux ~/.profilebeim Start automatisch als Quelle in Ihre Shell eingefügt. Wenn Sie also zu Ihrem Terminal gehen und tippen cd ~; ls -A, sehen Sie alle Ihre Dateien und Verzeichnisse in Ihrem Home-Verzeichnis ( /home/usrname/). Sie sollten eine Datei mit dem Namen sehen .profile. Dies ist die Datei, die beim Starten des Terminals automatisch "bezogen" wird.

Wenn Sie Aliase und Funktionen hinzufügen möchten ~/.bashrc(was ich auch mache), sollten Sie (innerhalb von) ~/.profileeine if-Anweisung hinzufügen, die prüft, ob ~/.bashrces sich um eine nicht leere Datei handelt, und diese dann als Quelle verwenden.

Um zu überprüfen, ob dies ~/.profilebereits erfolgt, geben Sie Folgendes ein nano ~/.profile. Dies öffnet es in einem Texteditor (Sie können gedit verwenden, wenn Sie wissen, dass Sie es haben, oder sogar vim, wenn Sie wissen, wie man es benutzt). Möglicherweise erhalten Sie eine leere Textdatei (Sie sollten es nicht tun), aber wenn Sie dies tun, fahren Sie einfach fort. Wenn Sie an keiner Stelle eine Zeile mit der Aufschrift sehen , source ~/.bashrcgeben Sie die folgenden Zeilen ein (platzieren Sie sie an einer angemessenen Stelle wie am Ende oder am Anfang und nicht in der Mitte einer if-Anweisung):

if [ -s ~/.bashrc ]; then
    source ~/.bashrc;
fi

Hiermit wird überprüft, ob ~/.bashrces sich um eine nicht leere Datei handelt (mit if [ -s ~/.bashrc ]), und wenn dies der Fall ist, wird sie als Quelle verwendet. Ziemlich einfach. Jetzt können Sie einen beliebigen gültigen Alias, eine Funktion, eine Variable usw. hinzufügen ~/.bashrc.


MAC OS X

Standardmäßig werden Max OS X-Quellen verwendet ~/.bash_profile. Um Dinge hinzufügen zu können ~/.bashrc(was auch in OS X der Fall ist), gehen Sie wie unter Linux vor. Im Terminal eingeben cd ~; nano .bash_profile. Suchen Sie nach einer Zeile, die besagt, source ~/.bashrcund fügen Sie die obige if-Anweisung ( if [ -s ~/.bashrc ]; then source ~/.bashrc; fi) hinzu, wenn sie nicht vorhanden ist .


ANMERKUNGEN

Lassen Sie beim Schreiben einer if-Anweisung grundsätzlich ein Leerzeichen zwischen allem ( if [ -s ~/.bashrc]; then echo "found"; fidies funktioniert beispielsweise nicht, da kein Leerzeichen dazwischen steht ~/.bashrcund ]- der Interpreter denkt, dass dies ein Wort ist).

Wenn Sie herausfinden möchten, wie Sie in einer if-Anweisung besser nach Dingen suchen können, gehen Sie zum Terminal und geben Sie Folgendes ein man \[. Dies gibt Ihnen im Wesentlichen die Möglichkeit, eine if-Anweisung herunterzufahren. if [ -f /path/to/file ]; then echo "it's a file"; else echo "not a file"; fiÜberprüft zum Beispiel, ob /path/to/filees sich um eine Datei handelt und ob diese entsprechend auf stdout gedruckt wird. Ich beziehe mich immer auch darauf, um die Augen zu schonen und eine schnelle Referenz zu haben: 7.2. Dateitest-Operatoren .

Ich hoffe das hilft. Ich erinnere mich, wie verwirrt ich war, als ich all dieses Zeug anfing (was nicht allzu lange her war); Also, viel Glück bei Ihren zukünftigen UNIX-Bemühungen!

Dylan
quelle
Unter Linux .profilebezogen ist nur , wenn Ihre Shell eine Login - Shell ist, sonst .bashrcbezogen ist
smac89
11

Sourcing .profile in .bash_profile hat es für mich getan

echo 'source ~/.profile' >> ~/.bash_profile
Luis S
quelle
1
Die Beschaffung von .profile in .bash_profile ist eine großartige Sache, aber das allein würde nicht dazu führen, dass .bashrc von Login-Shells ausgeführt wird. Ihr .profile muss bereits .bashrc-Quellcode haben, was zu Problemen führen kann, wenn Sie eine andere Shell als bash verwenden. Die meisten Mac-Benutzer werden es niemals tun, aber wenn Sie es aus irgendeinem Grund tun, denken Sie daran. :)
Terry N
Um zu erweitern, was @TerryN gesagt hat: Achten Sie darauf, .bashrcvon Ihrem .bash_profileund nicht von Ihrem zu beziehen .profile. .bash_profileist Bash-spezifisch und sollte die anderen beiden beziehen.
Chris Seite
6

Ich fand, dass nach der Installation von rvm (Auto-Installer, keine manuellen Änderungen) eine ~/.bash_loginDatei für sich selbst erstellt wurde, wo ich zuvor noch nie eine hatte.

Dies bedeutet jedoch, dass meine ~/.profileSetups und Aliase nicht mehr geladen wurden! Viele Verknüpfungen sind verschwunden. Ich dachte, sie liefen der Reihe nach, nicht ausschließlich: - /

Ich fügte hinzu

. ~/.profile 

bis ~/.bash_loginzu Kette Dinge wie erwartet ich.

dman
quelle
+1, das ist die Situation, die ich hatte. Ich habe festgestellt, dass entweder .bash_login oder .bash_profile die Ausführung von .profile verhindern ... Keine Ahnung, warum bash das Bedürfnis hat, so viele in Konflikt stehende Startdateien zu haben.
RichVel
.profileist mehreren verschiedenen Shells gemeinsam und sollte nur POSIX-kompatiblen sh-Code enthalten. .bash_profileist Bash-spezifisch und kann Bash-spezifischen Code enthalten. Wenn Sie Bash verwenden, sollten .bash_profileSie es im Allgemeinen vorziehen, es sei denn, Sie achten darauf, dass Ihr Startcode nichts enthält, was von Bash abhängt. Welches Programm auch immer erstellt wurde, hat dies .bash_loginwahrscheinlich getan, weil es Bash-spezifischen Code enthält, aber es sollte Quellcode enthalten, .profilefalls vorhanden.
Chris Seite
3

Putten...

[[ -s "$HOME/.rvm/scripts/rvm" ]] && . "$HOME/.rvm/scripts/rvm" # Load RVM function

... in ~/.bashrcund dann Source ~/.bashrcin ~/.bash_profile funktionierte nicht für das Terminal-Programm, das installiert wird.

Dann ging ich zum Dropdown-Menü Bearbeiten> Profileinstellungen , Registerkarte Titel und Befehl und wählte im Befehlsbereich dieser Seite Befehl als Anmeldeshell ausführen aus.

Danach zeigt das Starten eines neuen Terminals das gewünschte Ergebnis, wenn ich tippe

 type rvm|head -1

dh "rvm ist eine Funktion". Es tat nicht, bis ich diese Änderung vorgenommen, und es ist die einzige Änderung , die ich nach den gemacht .bash_profileund .bashrcÄnderungen in anderen Antworten hier beschrieben.

LiquidMark
quelle
2

Lassen Sie mich zunächst sagen, dass dies ~/.bashrcdie Datei ist, die jedes Mal ausgeführt wird, wenn eine zweite Shell aufgerufen wird (z. B. beim Ausführen eines Shell-Skripts) und ~/.profilebei jedem Login aufgerufen wird.

Ich empfehle Ihnen daher, einen . ~/.bashrcBefehl in Ihre ~/.profileDatei zu schreiben. Dieser Befehl führt die bashrc-Datei jedes Mal aus, wenn Sie sich anmelden.

Arun Rana
quelle
Wenn .profile beim Anmelden ausgeführt wird, wird automatisch die .bashrc-Datei ausgeführt.
Arun Rana
so wird .bashrc bei jedem login indirekt ausgeführt
arun rana
1
bashrc ist für nicht angemeldete Shells. bash_profile / bash_login / profile / was auch immer sonst für Login-Shells ist. Dies ist eine Quelle großer Konflikte, bei denen es um eine Anmeldeshell (z. B. eine Screen / TMUX-Sitzung, ein Terminal in einer Desktop-Umgebung usw.) geht. Es ist nicht unbedingt die "zweite Schale". Es ist eine Frage des Shelleintritts.
Jason Salaz
3
Wenn Sie jemals eine Shell verwenden, die nicht Bash ist, kann es zu Problemen kommen, wenn Sie das tun, was Sie beschreiben. .profile gilt für alle Shells und .bashrc enthält möglicherweise eine Sprache, die einige andere Shells nicht verstehen. Tragen Sie anstelle von .profile das, was Sie geschrieben haben, in .bash_profile ein. (Stellen Sie außerdem als erstes sicher, dass .bash_profile "source .profile" ist.)
Terry N
1

Nach der Installation von rbenv auf meinem Remote-Server (Digital Ocean) Ubuntu 16.04 trat das gleiche Problem auf.

Es hat irgendwie geschafft ~/.bash_profile. ~/.bashrcAuf einem OS X-System ist es dasselbe .

Und Ubuntu fing an, nur zu lesen ~/.bash_profile, aber nicht so, ~/.bashrcwie es sollte.

Also habe ich meine Daten ~/.bash_profilemit folgendem Befehl gesichert :

mv ~/.bash_profile ~/.bash_profile.bak

Und benannte das Alte um ~/.bashrcin~/.bash_profile

mv ~/.bashrc ~/.bash_profile

Es hat bei mir funktioniert. Nach meinem SSH Login habe ich alles geladen ~/.bashrc.

zhisme
quelle
0

Für den Fall, dass dies jemand anderem helfen könnte ...

Stellen Sie sicher, dass Sie die richtige .bashrcDatei für den richtigen Benutzer bearbeiten . Ich hatte ein ähnliches Problem mit Vagrant. Nach dem Ausführen wurde vagrant sshmeine .bashrcDatei nicht ausgeführt. Die Lösung war einfach, da ich dachte, Vagrant würde sich mit dem Benutzer namens Vagrant anmelden und ich würde mich tatsächlich als ein anderer Benutzer anmelden. Also habe ich die falsche .bashrcDatei bearbeitet . Nach der Bearbeitung der korrekten .bashrcDatei wurden meine Aliase erkannt.

Allen
quelle
-1

Übrigens, wenn Sie ZSH aktiviert haben, ersetzt es Bash!

Alle diese ~/.bashrcDateien werden also nicht geladen.

Sie müssen ~/.zshrcstattdessen Ihre Aliase festlegen .

Frédéric Adda
quelle
-2

Um den OSX-Anmeldestil beizubehalten .profileund das normale Bash-Verhalten zu unterstützen .bashrc, können Sie eine .bashrcDatei verwenden, wenn Sie zwischen regulärem nix und OSX wechseln, indem Sie einen symbolischen Link zu Ihrer .bashrcDatei mit dem Namen bereitstellen .bash_profile. Stellen Sie einfach sicher, dass diese Datei noch nicht existiert, bevor Sie dies versuchen, aber so mache ich es.

ln -s .bashrc .bash_profile
Tintenfleck
quelle
Durch diese Verknüpfung zwischen 2 verschiedenen Shell-Initialisierungsskripten verlieren Sie die notwendige Funktionstrennung. An dem einen oder anderen Tag benötigen Sie eine Initialisierung auf Sitzungsebene ( .bash_profile) und eine Initialisierung auf jeder Shell-Ebene ( .bashrc).
Dan
-2

/ etc / bashrc ist für globale Profile auf Mac-Systemen. Sie können Folgendes hinzufügen: alias ls = "ls -G" am Anfang dieser Datei, und zu Ihrer Zufriedenheit werden alle Dateien und Ordner auf dem System koloriert, sodass Sie für jeden einzelnen Benutzer keine zusätzlichen Einstellungen vornehmen müssen. Sie werden auch feststellen, dass Sie zusammen mit "sudo su -", um von sich aus zu rooten, immer noch farbige Dateien und Ordner ohne zusätzliche Kopfschmerzen haben.

Ein weiterer lustiger Tipp: Wenn Sie Iterm2 von Mac verwenden, werden beim Importieren von Farbprofilen die Farben der Dateien und Ordner sofort entsprechend Ihrem Farbschema gerendert, nachdem diese Option auf "/ etc / bashrc" gesetzt wurde.

Sulayman Touray
quelle