Was machen die Skripte in /etc/profile.d?

85

Ich lese über grundlegende Shell-Skripte aus der Linux-Befehlszeile und der Shell Scripting Bible .

Die /etc/profileDatei legt die Umgebungsvariablen beim Start der Bash-Shell fest. Das /etc/profile.dVerzeichnis enthält andere Skripte, die anwendungsspezifische Startdateien enthalten, die ebenfalls zum Startzeitpunkt von der Shell ausgeführt werden.

  • Warum sind diese Dateien nicht Teil von, /etc/profilewenn sie auch für den Start von Bash von entscheidender Bedeutung sind?

  • Wenn diese Dateien anwendungsspezifische Startdateien sind, die für den Bash-Start nicht kritisch sind, warum sind sie dann Teil des Startvorgangs? Warum werden sie nicht nur ausgeführt, wenn die spezifischen Anwendungen, für die sie Einstellungen enthalten, ausgeführt werden?

Ascheshr
quelle

Antworten:

71

Warum sind diese Dateien nicht Teil von / etc / profile, wenn sie auch für den Start von Bash kritisch sind?

Wenn Sie meinen, "Warum werden sie nicht einfach zu einem riesigen Drehbuch kombiniert?", Lautet die Antwort:

  1. Denn das wäre ein Wartungs-Albtraum für die Leute, die für die Skripte verantwortlich sind.
  2. Da das Laden der Skripte als unabhängige Module das gesamte System dynamischer anpassbar macht, können einzelne Skripte hinzugefügt und entfernt werden, ohne die anderen zu beeinflussen. Usw.
  3. Weil sie über / etc / profile geladen werden, wodurch sie ohnehin auf die gleiche Weise Teil des Bash- "Profils" werden.

Wenn diese Dateien anwendungsspezifische Startdateien sind, die für den Bash-Start nicht kritisch sind, warum sind sie dann Teil des Startvorgangs? Warum werden sie nicht nur ausgeführt, wenn die spezifischen Anwendungen, für die sie Einstellungen enthalten, ausgeführt werden?

Das scheint mir eine umfassendere Frage der Designphilosophie zu sein, die ich in zwei Teile aufteilen werde. Die erste Frage betrifft den Wert und die Angemessenheit der Verwendung der Shell-Umgebung. Hat es einen positiven Wert? Ja, das ist nützlich. Ist es die beste Lösung für alle Konfigurationsprobleme? Nein, aber es ist sehr effizient für die Verwaltung einfacher Parameter und auch weithin anerkannt und verstanden. Wenn Sie sich jedoch für eine heterogene Konfiguration entscheiden, könnte $ PATH möglicherweise von einem separaten, unabhängigen Tool verwaltet werden. Bevorzugte Tools wie $ EDITOR könnten sich in einer SQLite-Datei befinden, $ LC lang könnte sich in einer Textdatei mit einem befinden Benutzerdefiniertes Format an anderer Stelle usw. - verwendet nicht nur env-Variablen und/etc/profile.dplötzlich einfacher erscheinen? Sie wissen wahrscheinlich bereits, was eine Umgebungsvariable ist, wie sie funktioniert und wie sie verwendet wird, und lernen 5 völlig unterschiedliche Mechanismen für 5 verschiedene allgegenwärtige Aspekte dessen, was angemessen als "die Umgebung" bezeichnet wird.

Die zweite Frage lautet: "Ist das Starten der richtige Zeitpunkt dafür?", Was den Einwand aufwirft, dass es nicht sehr effizient ist (all die Daten, die möglicherweise verwendet werden oder nicht, usw.). Aber:

  • Realistisch gesehen sind es nicht allzu viele Daten, zum Teil, weil niemand, der bei Verstand ist, sie für mehr als ein paar einfache Parameter verwenden würde (da es andere Möglichkeiten gibt, eine Anwendung zu konfigurieren).
  • Wenn es in Bezug auf häufig aufgerufene Dinge mit Bedacht verwendet wird, ist gcces weniger effizient, wenn Sie beispielsweise jedes Mal $ CFLAGS aus einer Datei als Standard festlegen . Denken Sie daran, dass die Größe des Speichers ebenfalls infinitesimal ist.
  • Es kann sich um systemische Dinge handeln, an denen mehr als eine Anwendung beteiligt sein kann, und die Shell ist eine gemeinsame Grundlage .

Dieser Liste könnten weitere hinzugefügt werden, aber dies gibt Ihnen hoffentlich eine Vorstellung von den Vor- und Nachteilen des Problems - die wichtigsten Vor- und Nachteile sind, dass es sich um einen globalen Namespace handelt.

Goldlöckchen
quelle
Does it have positive ... and understood.Was versuchst du hier zu sagen? Ich habe alles andere als diesen Absatz verstanden.
Asheeshr
3
Die Shell-Umgebung wird im Allgemeinen zum Konfigurieren der Shell selbst und anderer allgegenwärtiger Tools verwendet. Dies ist nicht die einzige Möglichkeit, die Konfiguration durchzuführen. Es ist daher zu überlegen, ob die Umgebung besser oder schlechter ist als die anderen Optionen. Mit "positivem Wert" meinte ich, dass die Verwendung der Umgebung einige Vorteile gegenüber anderen Optionen zu haben scheint, zumindest WRT ", das einfache Parameter verwaltet" - nämlich, dass es sehr effizient und "weithin anerkannt und verstanden" ist ... und ich Ich werde ein bisschen hinzufügen, um diesen Satz weiter zu erklären.
Goldlöckchen
Was ist mit dem Anhängen von Zeilen an profile.local? Ist dies akzeptabel im Vergleich zum Erstellen von Skripten im Ordner profile.d?
Avindra Goolcharan
@ AvindraGoolcharan Verschiedene Distributionen können unterschiedliche Schemata für diese Art von Dingen verwenden. Das profile.dVerzeichnis funktioniert nur, weil sein Inhalt von stammt /etc/profile, was durch Shells wie Bash als Startdatei angegeben wird (siehe INVOCATION in man bash). Wenn Sie bearbeiten /etc/profile, können Sie deaktivieren /etc/profile.d. /etc/profile.localscheint eine SUSE-Erfindung zu sein, die vermutlich von irgendwoher stammt, /etc/profiledamit Sie Ihre eigenen Sachen dort unterbringen können. Wenn Sie es jedoch auf ein anderes System als SUSE verschieben und keine weiteren Anpassungen vornehmen, wird es von niemandem verwendet.
Goldlöckchen
Gotcha, das ist glasklar. Ja, wir benutzen SUSE bei meiner Arbeit. / etc / profile. scheint eine viel bessere Wette zu sein.
Avindra Goolcharan
13

Diese Dateien sind für eine Anwendung spezifisch, werden jedoch beim Starten der Shell und nicht beim Starten der Anwendung bereitgestellt. Ein Konfigurationsverzeichnis wird hier aus dem gleichen Grund verwendet, wie es an vielen anderen Stellen vorkommt. Auf diese Weise kann eine Anwendung oder ein Softwarepaket Konfigurationen ändern. Dies wäre ohne eine geteilte Konfiguration nicht möglich, da mehrere Pakete, die versuchen, eine einzelne Konfigurationsdatei zu verwalten / aktualisieren, die auch vom Benutzer geändert werden kann, fehlerhaft und unübersichtlich wären.

Auch eine Randnotiz, /etc/profilewird von allen Muscheln bezogen, nicht nur von Bash. Die bash-spezifische Konfigurationsdatei ist bashrc und wird nur für interaktive Shells verwendet.

Jordanien
quelle
3
Der zweite Absatz ist interessant. Da verschiedene Shells unterschiedliche Syntax unterstützen, müsste es eine signifikante gemeinsame Syntax geben. Richtig für bash und sh, aber ich denke nicht für andere wie csh oder tcsh, die ihre eigenen globalen Anmeldestartskripte haben. Auf vielen Systemen ist / bin / sh nur eine Verknüpfung zu / bin / bash. Bash ändert sein Verhalten jedoch so, dass es posix-kompatibel ist, wenn es als sh aufgerufen wird. Man könnte also annehmen, dass Autoren von Skripten in /etc/profile.d vorsichtig sein müssen, um die Verwendung von Bash-Erweiterungen außerhalb der Posix-Teilmenge zu vermeiden.
Sootsnoot
Unter Linux gibt es für die beiden Haupt-Shell-Typen separate .csh- und .sh-Dateien.
Stark
0

Die Antwort von Jordan ist falsch. /etc/profilewird nicht von allen Shells beschafft. Wie Sie weisen darauf hin, ist es nicht von Quellen csh, tcsh- ich bin nicht sicher zsh. Es wird von Bourne Shell ( sh) -Derivaten wie Korn Shell ( ksh) und BASH ( bash) bereitgestellt . cshverwendet /etc/login. Menschen, die dazu neigen, ausschließlich Borne Shell-Derivate zu verwenden, neigen dazu, andere Schalen zu vergessen. Sie fügen etwas hinzu, um zu /etc/profileerwarten , dass es für "alle Benutzer" gilt, und sind dann überrascht, wenn der ungerade C-Shell-Benutzer (und wir sind eine ungerade Menge) nicht über das Zeug verfügt, in dem sie konfiguriert sind /etc/profile.

Trotzdem neigen die Leute dazu, andere Borne Shell-Derivat-Shells zu vergessen. Wenn sie bashoder verwenden ksh, können sie Syntax hinzufügen, /etc/profiledie in Bourne Shell nicht gültig ist, beispielsweise eine Variable definieren und in dieselbe Zeile exportieren. Dann bekommen Sie ein Skript, das funktioniert #!/bin/shund die Syntax unterdrückt. /etc/profilesollte sich an die Bourne Shell-kompatible Syntax halten.

Ebenso sollten Sie sich an Ihre eigene halten .profile(verwenden .bash_profileSie diese Option, wenn Sie eine Bash-Syntax wünschen) - es kann ein bisschen mehr Tipparbeit sein, aber es ist mehr Tipparbeit, die Sie alle einmal ausführen. Verweis ${HOME}und nicht ~, etc. Einige Unix- und Cron-Versionen laufen unter sh, jede Ihrer Zeilen wird von Makefileverarbeitet. shWenn Sie also mit mehreren UNIX-Versionen arbeiten, lohnt es sich wirklich, Ihre .profileBourne-Shell kompatibel zu halten . Als SysAdmin kann ich Ihnen nicht sagen, wie oft ich jemandem geholfen habe, indem ich .profiledie Bourne Shell-Kompatibilität behoben habe .

Unter Linux /bin/shist es ein Link zu /bin/bashund wenn Sie es ausführen, sieht es nach dem Pfad aus, der zum Ausführen verwendet wurde, und beschränkt sich (theoretisch) nur auf Dinge, die von Bourne Shell unterstützt werden. Ebenso viunter Linux beschränkt sich das eigentlich vimwieder. Gelegentlich sehen Sie Merkmale "durchbluten". Gelegentlich wird das so vimtun, als würde vies etwas tun, was dies nicht vimunterstützt, viweil die Autoren vimvergessen haben, dies im "vi Abwärtskompatibilitäts" -Modus zu deaktivieren. Es würde mich nicht wundern, wenn so zu bashtun, als ob es shähnliche "Durchblutungs" -Funktionen gäbe . Wäre nicht überrascht, wenn eine Funktion "unter Borne Shell unter Linux funktioniert", aber nicht auf einem System V- oder BSD-basierten UNIX (AIX, OpenBSD usw.).

Damokles
quelle
Sind Sie sicher, dass "unter Linux /bin/shein Link zu /bin/bash" ist? Das ist eine vernünftige Aussage.
41754