Unterschied zwischen bash.bashrc und / etc / environment file

42

Bis zu dem Datum, an dem ich meine Umgebungsvariablen in der bash.bashrcDatei festgelegt habe. Kürzlich wurde mir gesagt, dass ich die /etc/environmentDatei verwenden soll. Nun, beide funktionieren gut.

Also, was ist der Unterschied zwischen ihnen?

Ich habe dies gegoogelt und festgestellt, dass "bashrc für bestimmte Benutzer und Umgebungen systemweit verwendet wird". Was ist hier mit systemweit gemeint? /etc/bash.bashrcIch denke auch, dass Änderungen systemweit angewendet werden. Korrigiere mich, wenn ich falsch liege. Jede Art von Hilfe wird geschätzt.

Trapaank
quelle

Antworten:

35

Ein Unterschied besteht darin, dass /etc/environmentnur Variablendefinitionen enthalten sind und keine Art von Variablenerweiterung / -interpolation durchlaufen. Daher können Sie in Definitionen keine Variablen referenzieren. Das funktioniert zum Beispiel nicht:

A="else"
B="something $A"

B wird buchstäblich something $Anicht das erwartete sein something else.

Siehe diese Frage .

Übrigens bezieht sich die Antwort, die Sie über Google gefunden haben, anscheinend auf einen Nutzer ~/.bashrcund nicht auf das gesamte System /etc/bash.bashrc. Das kann zu Verwirrung führen.

Roadmr
quelle
Was ist der Zweck von ~ / .bashrc, wenn es zwei Dateien gibt, die dasselbe tun / etc / environment und /etc/bash.bashrc?
Trapaank
6
Die Datei /etc/bash.bashrc wird ausgeführt, wenn ein Benutzer eine Bash öffnet. Der Befehl ~ / .bashrc wird nur ausgeführt, wenn der Eigentümer des Ausgangsverzeichnisses, in dem er gespeichert ist, eine Bash öffnet.
André Stannek
18

Die /etc/environmentDatei legt das variable System für jeden Benutzer beim Booten fest. Befehle im /etc/bash.bashrcare werden ausgeführt, wenn die bashShell von einem Benutzer geöffnet wird. Die Variablen würden also nicht gesetzt, wenn eine bashShell nicht mindestens einmal geöffnet würde.

André Stannek
quelle
Entschuldigung, ich bin ein Linux-Neuling. Welche Bash-Shell wird geöffnet? und eine andere Sache, wenn die Bash-Shell geöffnet wird, überschreibt sie die in / etc / enviornment eingestellte Variable oder nicht?
Trapaank
Ich bin nicht sicher, wann / etc / environment genau ausgeführt wird, aber die Datei /etc/bash.bashrc wird von Ubuntu ausgeführt, wenn Sie Ihre Desktop-Umgebung aufrufen. Deshalb funktioniert es, wenn Sie die Variablen dort setzen. Ich vermute, dass die Datei / etc / environment beim Booten einmal ausgeführt wird, bevor Sie auf Ihren Desktop zugreifen, und dass die Ausführung der Datei /etc/bash.bashrc die Variablen überschreibt. Aber noch einmal: Da bin ich mir nicht sicher.
André Stannek,
4
Es ist bei der Anmeldung, nicht booten!
Slm
6

Und wenn Sie nach " systemweit " fragen :

Konfigurationsdateien im /etcVerzeichnis gelten für alle Benutzer im System. Denn /etc/bash.bashrcdas würde für alle und alles bedeuten, was die "Borne Again SHell" aka Bash auf dieser Maschine verwendet. Auch wenn Sie der einzige Mensch sind, der es verwendet, kann es sein, dass "technische Benutzer" betroffen sind (werfen Sie einfach einen Blick in das /etc/passwdund überprüfen Sie, wie oft der Begriff "/ bin / bash" dort angegeben ist - oder verwenden Sie grep bash /etc/passwd | wc -l, was Ihnen geben sollte Diese Zahl direkt (dh alle Zeilen mit der Zeichenfolge "bash" aus der Datei "/ etc / passwd" "greifen" und die Ergebnisse ("|") an den Befehl "wc" (word count) senden, um die Zeilen zu zählen ("-l").

Für Ihren Benutzer ist es daher viel sicherer, ~/.bashrcstattdessen Änderungen vorzunehmen (dh die Datei ".bashrc" - mit einem vorangestellten Punkt, ja - in Ihrem Home-Verzeichnis, z. B. /home/ankur/.bashrc), die dann nur Ihren Benutzer betreffen und alles andere in Ruhe lassen . Dateien in /etcsollten nur geändert werden, wenn systemweite Änderungen tatsächlich beabsichtigt sind.

Außerdem: Beide Konfigurationen werden verwendet, wenn sie existieren. Zuerst wird die systemweite Datei (hier /etc/bash.bashrc:) gelesen und "bezogen" (die Einstellungen beziehen sich auf die aktuelle Sitzung), dann werden die Benutzer gleich /home/username/.bashrcbehandelt und können somit Einstellungen aus der globalen heraus hinzufügen oder sogar ändern / überschreiben /etc/bash.bashrcDatei.

Izzy
quelle
3

Abgesehen von der systemweiten und benutzerweiten Diskussion besteht ein wesentlicher Unterschied darin, dass es /etc/environmentsich nicht um ein anderes Skript handelt ~/.bashrc.

Sie können die Referenzierung von Variablen nicht aufheben /etc/environment, da deren Variablenzuordnung den Zeilenwert buchstäblich annimmt (wie bereits von roadmr erwähnt).

Ubuntu wird Sie sperren , wenn Sie die Schraube nach oben $PATHinnen , /etc/environmentindem Sie versuchen neue Wege anzuhängen

PATH=$PATH:/new_path

Wenn Ihre Ubuntu Gnome- oder Unity-Anmeldeseite Sie nicht ohne Beschwerde über ein falsches Passwort einlässt. Und Sie haben vor kurzem geändert /etc/environment, es ist höchstwahrscheinlich der Fall.

Ein Update ist die virtuelle Konsole anmelden CTRL+ ALT+ F1Login - Konsole manuell überprüfen $PATHund fix /etc/environmentDatei.

Nach diesem , /etc/environmentwird durch PAM Stapel geladen, die durch die Linie Umgebungsvariable Linie auffüllt.

legendbb
quelle
-1

Der Unterschied zwischen den beiden besteht darin, dass die /etc/enivironmentDatei für alle Benutzer funktioniert, während die Datei bash.bashrc insbesondere nur für diesen Benutzer funktioniert. Und wenn Sie irgendetwas an der /etc/environmentDatei falsch machen, können die Folgen schwerwiegend sein, während Sie die Änderungen in der Datei bash.bashrc einfach rückgängig machen können, indem Sie den Inhalt der Datei / etc / environment kopieren. Die erste Präferenz ist jedoch die bash.bashrcDatei und dann die Datei / etc / environment. Wenn Sie Änderungen an der bash.bashrcDatei vornehmen, gibt das Terminal nicht zuerst der lokalen Benutzerdatei (dh bash.bashrc) und dann der Hauptdatei (dh /etc/environment) den Vorzug .

Pranit Bauva
quelle
Ich glaube, Sie verwechseln die Dateien ~ / .bashrc und /etc/bash.bashrc. Der erste ist lokal für Benutzer, die eine Shell öffnen, der zweite ist global für alle Benutzer, die eine Shell öffnen.
Dennis