Warum beziehen die Leute bash_profile von bashrc anstatt umgekehrt?

7

Es hört sich so an, als würden die meisten Terminalemulatoren standardmäßig keine lokalen Sitzungen als Anmeldung ausführen, also laden sie bashrc und nicht bash_profile. Warum also schreiben die meisten Leute alles in bash_profile und lassen es von bashrc als Quelle verwenden, anstatt es umgekehrt zu machen? Mit "den meisten Menschen" meine ich die meisten Menschen, die ich bisher gesehen habe. Vielleicht ist es nicht so weit verbreitet, wie ich denke.

Wäre es nicht sinnvoller und konsistenter mit der Linux-Community, alles in bashrc abzulegen und bash_profile als Quelle zu haben, anstatt unsere Konfiguration dort abzulegen und bash_profile als Quelle zu haben?

Ich habe gute Dinge über iTerm2 gehört, und es hört sich so an, und fast jeder andere Terminal-Emulator (außer dem Standard-OSX-Terminal) würde bashrc laden, wenn ich lokal arbeite. Nicht, dass es wichtig wäre, solange eine Quelle die andere ist, aber ich bin verwirrt, warum es der Standard ist, bash_profile zu bevorzugen.

Kleine Randnotiz: Ich habe mich bei iTerm2 geirrt. Standardmäßig werden Anmeldesitzungen wie in Terminal.app ausgeführt, obwohl beide Emulatoren eine Option zu haben scheinen, mit der Sie dies ändern können.

ivan
quelle

Antworten:

10

Die Leute beziehen bash_profile von bashrc anstatt umgekehrt aufgrund der örtlichen Konvention .

All die Meinung dass ich gelesen habe, wie man ihre Startdateien in konfiguriert bash basiert hauptsächlich auf lokalen Konventionen. Die lokale Konvention erwähnt normalerweise nicht das große Ganze, da sie nicht viel über den Fall der Nichtanmeldung und der Nichtinteraktivität spricht. Das lustige ist, und ich habe geschaut, aber ich sehe selten jemanden erwähnen cron in all ihren Vorträgen darüber, warum man Variablen in eine Startdatei versus die andere legt. Tatsächlich habe ich keinen Kommentar sagen hören: " / bin / sh gibt es aus einem Grund. Bash emuliert die ursprüngliche Bourne-Shell / bin / sh, wenn sie als solche aufgerufen wird. "Zum einen, und ich schweife ein wenig ab, ist dieser Fall wichtig für Leute, die nicht nur interaktiv mit der Shell arbeiten, sondern auch nicht interaktiv und nicht angemeldet sind ( unbeaufsichtigt oder Hintergrund ) cron Skripte, die eine minimale Shell-Verarbeitung erfordern, d. h. Hintergrundverarbeitung, erfordern nicht die Feinheiten von farbigen Eingabeaufforderungen, Befehlsverlauf und -ersetzung, eine korrekt definierte $ TERM-Variable usw.

Weiter und in Bezug auf cronWas ich normalerweise sehe, sind Leute, die minimale Suchpfade erstellen oder voll qualifizierte Programme aufrufen und nicht wissen, wie sie mit Ausgaben umgehen sollen, die nicht mit einem Terminal verbunden sind (d. h. nicht interaktiv, nicht angemeldet) bash oder sh Fall) bei der Arbeit mit ihren cron Skripte. Dies liegt normalerweise daran, dass ein gutes Verständnis der Shell-Startsequenz nicht vollständig verstanden wird, was dazu führt, dass ein Benutzer seine eigenen Startdateien in einer Weise implementiert, die mit den bereits in der lokalen Umgebung festgelegten Konventionen inkonsistent oder inkohärent ist /etc Startdateien.

Das Setup, das durch lokale Konventionen vorgenommen wird, ist in der jeweiligen Installation und Shell beschrieben /etc Dateien. Wenn man eine UNIX-Installation untersucht /etc Dateien, die als Teil eines Typicals aufgerufen werden bash Startreihenfolge, dann sollte man sein eigenes Startup in einer Weise erstellen, die zu der darin festgelegten Konvention komplementär ist /etc Startdateien.

Im Linux-Dokumentationsprojekt heißt es:

/ etc / skel / Hier werden die Standarddateien für jeden neuen Benutzer gespeichert   Verzeichnis. Jedes Mal, wenn ein neuer Benutzer hinzugefügt wird, werden diese Skelettdateien hinzugefügt   in ihr Home-Verzeichnis kopiert. Ein durchschnittliches System hätte:   .alias-, .bash_profile-, .bashrc- und .cshrc-Dateien. Andere Dateien bleiben übrig   bis zum Systemadministrator.

Obwohl die bash Im Handbuch werden diese Dateien nicht erwähnt, die häufig im Internet zu finden sind /etc/skel Verzeichnis explizit, von was ich mich erinnere, SunOS, Solaris, RedHat, Ubuntu, HP-UX, umips, & amp; Ultrix haben /etc/skel Dateien, nach denen die Shell-Startdateien eines Benutzers strukturiert werden sollen. OSX macht das eindeutig nicht - ich verwende gerade OSX 10.9.1. Leider gibt Ihnen OSX nicht viel zu sagen, wie die Dinge in Bezug auf Konventionen eingerichtet werden sollen, aber da OSX ein BSD-Derivat ist, habe ich einfach ein anderes BSD-Derivat verwendet und mein eigenes Muster erstellt bash Anschließend wird die Startsequenz so angepasst, dass sie den in OSX 10.9.1 verwendeten lokalen Konventionen entspricht /etc Startdateien.

Ein wichtiger Punkt, der in einem parallelen Kommentar erwähnt wurde, ist, dass für OSX die Konvention darin besteht, jedes neue Terminal als interaktive Anmeldeshell zu starten. Dies ist in der Tat die Standardeinstellung in OSX. Es gibt kein Problem mit dieser Konvention, solange die Benutzer einer Installation konsistent sind. Das Standardverhalten für das Terminal unter OSX kann geändert werden, um es mit den Shell-Startkonventionen anderer UNIX-Distributionen in Einklang zu bringen, indem die folgenden Änderungen an den Einstellungen des Terminals vorgenommen werden Ändern Sie insbesondere die Einstellung, Shells open with: das ausstellen /usr/bin/login -f -l whmcclos bash -i Befehl:

enter image description here

Mit all dem als Hintergrund oder Einführung, werde ich darauf eingehen Mein bester Rat , für was es wert ist.

Mein bester Rat:

Untersuchen Sie die Dateien, die die Administratoren Ihrer UNIX-Distribution erstellt haben. Beginnen Sie mit den folgenden Positionen, falls vorhanden. Vergiss nicht das zu benutzen ls -a Befehl, da einige Dateien mit einem Punkt beginnen. Sehen Sie, wie diese Dateien während des Startvorgangs verwendet werden und wie Ihre eigenen Startdateien mit ihnen interagieren:

/etc/bashrc
/etc/profile
/etc/skel/.bash_logout
/etc/skel/.bashrc
/etc/bash.bashrc
/etc/bash_completion

Schau in den bash Handbuch für die Aufruf- und Startsequenz. Es ist alles sehr gut angelegt.

Mit all dem als Einschränkung - hier ist, wie ich die Dinge in meiner OSX 10.9.1-Installation gemacht habe - Andere UNIX-Distributionen WERDEN unterschiedlich sein, aber was unten dargestellt ist, sollte für die meisten, wenn nicht alle UNIX-Distributionen funktionieren, aber diese anderen UNIX-Distributionen verwenden. Konvention als Leitfaden, um das Folgende für Ihre eigenen Zwecke maßzuschneidern:

.Profil

# ~/.profile: executed by the command interpreter for login shells.

# This file is not read by bash(1), if ~/.bash_profile or ~/.bash_login
# exists.  Note, however, that we will have a ~/.bash_profile and it
# will simply source this file as a matter of course.

# See /usr/share/doc/bash/examples/startup-files for examples.
# The files are located in the bash-doc package.

# From here on out, I basically set up my PATH, LD_LIBRARY_PATH, and anything else I'd like
# global to running programs and how those programs find their libraries.  This is shared by
# `cron`, so we really don't want interactive stuff, here.  Also, I setup my environments
# for brew, macports, and fink here, essentially with setting PATH, and invocation of those
# package initialization file as in:

# Brew and locally compiled stuff:
export PATH=/usr/local/bin:$PATH
export PATH=/usr/local/sbin:$PATH

# The following line puts gnu utilities without the prefix "g" in the path
# i.e. tar/gtar:
export PATH=$PATH:/usr/local/Cellar/coreutils/8.21/libexec/gnubin

# MacPorts shoves stuff in /opt, so to get at that stuff...
export PATH=/opt/local/bin:$PATH
export PATH=/opt/local/sbin:$PATH

# Set up for using Fink, which lives in /sw:
[ -e /sw/bin/init.sh ] && . /sw/bin/init.sh

# My stuff:
export PATH=~/perl:$PATH
export PATH=~/bin:$PATH
export PATH=.:$PATH

.bashrc

# ~/.bashrc: executed by bash(1) for non-login shells.
# see /usr/share/doc/bash/examples/startup-files (in the package bash-doc)
# for examples

# If not running interactively, don't do anything
[ -z "$PS1" ] && return

# From here on out, I put in things that are meaningful to interactive shells, like aliases,
# `shopt` invocations, HISTORY control, terminal characteristics, PROMPT, etc.

.bash_profile

# ~/.bash_profile: executed by the command interpreter for login shells.

# Because of this file's existence, neither ~/.bash_login nor ~/.profile
# will be sourced.

# See /usr/share/doc/bash/examples/startup-files for examples.
# The files are located in the bash-doc package.

# Because ~/.profile isn't invoked if this files exists,
# we must source ~/.profile to get its settings:
if [ -r ~/.profile ]; then . ~/.profile; fi

# The following sources ~/.bashrc in the interactive login case,
# because .bashrc isn't sourced for interactive login shells:
case "$-" in *i*) if [ -r ~/.bashrc ]; then . ~/.bashrc; fi;; esac

# I'm still trying to wrap my head about what to put here.  A suggestion
# would be to put all the `bash` prompt coloring sequence functions as
# described on http://brettterpstra.com/2009/11/17/my-new-favorite-bash-prompt/

Das sind meine zwei Cent. Denken Sie daran, dass meine Beispiele versucht haben, den Steuerpfad durch die Startdateien anzuzeigen und zu vermeiden, welche Konventionen eine bestimmte Site auferlegt.

Billy McCloskey
quelle
In letzter Zeit hat Apple Nachrichten in die Cron-Manpage aufgenommen, die besagen, dass sie weiterhin unterstützt werden. Apple behauptet jedoch, dass der Startdienst flexibler ist. Ich verzichte nicht auf den Cron-Hintergrundprozess, aber ich weiß, dass die Systemadministratoren mich wirklich nicht gern verlassen mit einem Kontroll-Thread, wenn ich technisch nicht eingeloggt bin. Apropos Steuerthreads: Irgendwo um Yosemite herum wurde der SSH-Port 22 vom Startdienst subsummiert, und der Startdienst fängt den SSH-Versuch ab und leitet ihn dann an Port 22 weiter!
Billy McCloskey
Der Grund, warum ich die Re-Routine von Port 22 für ssh aufrufe, ist, dass Sie früher oder später in RSA-PGP-Schlüssel und dergleichen geraten oder Ghost-Anmeldeversuche vom Typ ssh für einfache Dienste, insbesondere bei aktivierter PGP-Verschlüsselung, schlagen kläglich fehl! Vergewissern Sie sich also, dass Ihr .bashrc- und .bash_profile-Verzeichnis usw. vorhanden sind, bevor Sie mit PGP und ssh arbeiten. Wenn ein einfaches "ssh me @ myIP ls" fehlgeschlagen ist, prüfen Sie, ob die obigen .bash_profile-Dateien usw. korrekt und vorhanden sind oder ob sie von jemandem kopiert wurden
Billy McCloskey
Ich mache nur den letzten Kommentar, indem ich in den letzten 3 Monaten 3 ssh-Konten eingerichtet habe. Jedes Mal habe ich die richtigen Schritte ausgeführt, aber die Start-Shell-Skripte eingerichtet und dann stundenlang versucht, herauszufinden, warum ich sie aufrufen musste "ls" als "/ bin / ls" und nichts anderes hat sehr gut funktioniert. Jedes Mal habe ich vergessen, dem neuen Benutzer eine Kopie meiner Shell-Startdateien zu geben. Und jedes Mal, wenn ich es tat, verschwanden all ihre Probleme. So? Es geht los. Eine Art Hintergrundverarbeitung - SSH-Verbindungen für Dienste.
Billy McCloskey
Gute Antwort! Eine Sache, ich sehe Sie erwähnen eine Datei an /etc/bashrc zusätzlich zu /etc/nash.bashrc. Ich wollte das entfernen, vorausgesetzt, es war ein Fehler, aber ich dachte, ich würde fragen. Gibt es Systeme, die mit einem /etc/bashrc Datei? Ich habe noch keinen in der Linux-Welt gesehen.
terdon
Mac OS X 10.13.1, das ich kürzlich installiert habe, ist bereits vorinstalliert /etc/bashrc Datei.
Billy McCloskey
4

warum setzen wir eigentlich alles in bash_profile?

.profile wurde ursprünglich von / bin / sh verwendet, wobei .profile die Abwärtskompatibilität ermöglicht.

Sofern Sie keinen Mac verwenden, wird nicht alles in bash_profile abgelegt. Es wird in bashrc gesetzt

Wäre es nicht sinnvoller und konsistenter mit der Linux-Community, alles in bashrc abzulegen und bash_profile als Quelle zu haben?

Es ist üblich, Systeminformationen in die Shell einzufügen, die geladen wird, wenn Sie eine Verbindung zum Computer herstellen (Betriebszeit, Pakete, die aktualisiert werden müssen, CPU-Temperatur usw.). Wenn bashrc bash_profile verwendet, werden alle diese Informationen jedes Mal angezeigt, wenn Sie eine neue Shell öffnen.

In Unix:

.bash_profile wird von Login-Shells geladen
.bashrc wird von interaktiven Shells geladen

Mit Ausnahme von Mac, für den die Anmeldeshell geladen wird jedes neue Terminal (interaktiv oder nicht)

Zusätzliche Ressourcen

unterschied zwischen bashrc und bash-profil

Wo werden Umgebungsvariablen angegeben?

spuder
quelle
@ spuder- Ich bin mir nicht sicher, welchen Punkt Sie mit der Aussage machen Mit Ausnahme von Mac, der die Login-Shell für jedes neue Terminal lädt (interaktiv oder nicht) . Ich habe gerade ein neues Terminal in iTerm2 und OSX Term.app geöffnet und beide haben mir interaktive Login-Shells präsentiert. Ihr Punkt ist?
Billy McCloskey
Mac ist gegenüber den meisten anderen Unixen. In Ubuntu wird der bashrc geladen, wenn neue Terminals geöffnet werden.
spuder
OSX macht das bash Start anders; Wohl hat jede UNIX - Distribution eine Konvention, die vom Administrator festgelegt wurde und sich in der /etc/skel und andere /etc Shell-Startdateien, die den lokalen Benutzern eine Infrastruktur auferlegen, die mit der Distribution variiert. Es ist schwierig, eine pauschale Aussage darüber zu treffen, welche Konvention richtig ist. Ich würde mit der örtlichen Versammlung gehen und das erweitern. Das bash Handbuch buchstabiert deutlich wann $HOME/.bashrc wird aufgerufen; für OSX, &Ampere; jeder andere : Interaktiv & amp; Nicht-Login. Es ist die vererbte Infrastruktur für den Shell-Start, mit der man sich am Ende auseinandersetzen muss.
Billy McCloskey
@ supder- Ich stimme Ihnen zu, dass die Terminal.app von OSX jeden erzwingt bash Die daran angehängte Shell ist standardmäßig eine Anmeldeshell. Ein informierter Benutzer, der die in Ubuntu verwendeten Konventionen befolgen möchte, bearbeitet einfach die Einstellungen in OSX Terminal.app und ändert die Muscheln öffnen mit: von Standard Login-Shell zum Befehl (vollständiger Pfad): Feld gesetzt auf /usr/bin/login -f -l userid bash -i. Dies ändert die Konvention, um alle Terminal.app als interaktive NICHT-Login-Shells wie Ubuntu zu starten. Unabhängig davon handelt es sich um eine lokale Konvention, die sich von Linux unterscheidet und mit der gearbeitet werden kann.
Billy McCloskey
1

[...] Ich bin verwirrt, warum es der Standard ist, bash_profile zu bevorzugen.

Wer sagt, dass es der Standard ist? Das Bash-Handbuch selbst hat dies zu sagen zu dem Thema:

Normalerweise enthält Ihr ~ / .bash_profile die Zeile

if [-f ~ / .bashrc]; dann . ~ / .bashrc; fi

nach (oder vor) Login-spezifischen Initialisierungen.

jjlin
quelle
Das ist interessant. Ich habe sicherlich den Eindruck, dass die meisten Leute es anders implementieren (bashrc sourcing bash_profile), aber meine Erfahrung ist begrenzt.
ivan
Dies gilt für Linux und umgekehrt für Mac
spuder