Für diese Antwort sind einige Kenntnisse und Erfahrungen im Umgang mit Shell-Skripten mit den Begriffen Variable, Wert, Variablensubstitution, Eingabeaufforderung, Echo, Kernel, Shell, Dienstprogramm, Sitzung und Prozess erforderlich.
Eine Umgebungsvariable (envar) ist ein Satz global definierter Variablen, die das Verhalten eines bestimmten Prozesses auf dem Betriebssystem eines Computers beeinflussen können.
1. Eine beispielhafte Einführung:
Wir ersetzen Envars durch a $
und Großbuchstaben . Zum Beispiel: $PS1
.
Wir können eine Envar folgendermaßen drucken:
echo $PS1
$PS1
Enthält den Wert der Unix-Eingabeaufforderung. Sagen wir, seine nativen Werte sind \u
\w
$
.
\u
steht für (aktuellen) Benutzer,
\w
steht für Arbeitsverzeichnis,
$
ist die Eingabeaufforderung zu begrenzen.
Also, wenn wir tun: echo $PS1
Wir sehen die Werte \u
, \w
und das Dollarzeichen am Ende.
Wir könnten das Unix-Verhalten in diesem Kontext ändern, wenn wir die Werte dieser envar ändern. Zum Beispiel:
PS1="\w >"
Nun sieht die Eingabeaufforderung so aus (vorausgesetzt, das Arbeitsverzeichnis heißt "John"):
John >
Auf die gleiche Weise, die wir tun könnten PS1="Hello, I'm your prompt >"
, werden wir echo $PS1
bringen:
Hello, I'm your prompt >
In Bash 4.xx können wir mit dem env
Befehl ALLE Envars im System drucken . Ich schlage vor, env
im Terminal auszuführen und mir die Ausgabe anzuschauen.
2. Wie werden diese Daten angezeigt und bearbeitet:
Im Terminal einer Sitzung können wir die mit Bash gelieferten Envars anpassen.
Die oben genannten Änderungen sind in der Regel vorübergehend und aus folgenden Gründen:
Jede Sitzung (die keine Untersitzung ist) ist eindeutig, und mehrere Prozesse können gleichzeitig ausgeführt werden (jeder mit einem eigenen Satz von Envars). In der Regel erfolgt jedoch eine Vererbung von Sitzung 0 zu Sitzung 1 und höher.
Änderungen, die wir an einem Prozess vornehmen, sind einzigartig und werden abgebrochen, wenn wir ihn schließen, ohne ihn auf irgendeine Weise zu speichern.
Wie können wir diese Änderungen speichern:
Abhängig vom ausgewählten Bereich gibt es verschiedene Möglichkeiten zum Speichern von envar-Änderungen. Hier sind verschiedene Bereiche (Ebenen) für solche Änderungen:
- Prozessebene: Die Envars sind nur für Programme in der aktuellen Sitzung verfügbar.
- Exportstufe: Die Envars sind für Programme in der aktuellen Sitzung oder allen ihren Untersitzungen verfügbar .
- Globale Ebene: Die Änderungen werden für alle Sitzungen (primäre und alle Subs) gespeichert.
Wo werden envar-Daten gespeichert:
Unix besteht aus drei Hauptschichten: Kernel, Shell und Dienstprogramme. AFAIK Jede Shell hat ihre eigenen Envars, die hauptsächlich oder ausschließlich in der Shell erstellt werden.
Der spezifische Ort, an dem diese global geändert werden müssen, ist normalerweise, /etc/profile
obwohl wir dies .bashrc
natürlich auch tun können .
3. Neue Envars erstellen:
Wir können neue Envars erschaffen und hier ist ein Weg; Ab Bash 4.xx gibt es keinen nativen Enavar-Namen MESSAGE
(wie gesagt, Envars werden normalerweise in Großbuchstaben geschrieben).
MESSAGE="Hello world!"
wird es für uns erstellen, und jetzt, wenn wir Echo eingeben $MESSAGE
, bekommen wir hello world!
.
Wenn wir bash
in unserer aktuellen Arbeitssitzung (Fenster) ausführen , würden wir eine neue Bash-Untersitzung starten und werden nicht mehr im ursprünglichen Prozess arbeiten, es sei denn, wir führen aus exit
.
Hinweis: In Betriebssystemen mit einem Terminalemulator (wie dem Ubuntu-Desktop) wird eine Untersitzung normalerweise im selben Fenster ausgeführt, eine neue Sitzung in einem anderen Fenster ist jedoch keine Untersitzung der vorhandenen Sitzung (dies ist ein benachbarter Prozess). .
Hinweis: Verwenden Sie keine Sonderzeichen in envar-Werten wie! oder sie werden nicht gespeichert.
Exportieren der Envar aus der ursprünglichen Sitzung in alle Untersitzungen:
Wir können die in der ersten Sitzung erstellte envar weiterhin verwenden, auch in der zweiten Sitzung, ohne sie in den conf-Dateien auf Benutzer- oder globaler Ebene zu registrieren (siehe folgende Daten). So geht's:
Gehen Sie zur ursprünglichen Sitzung (ob im aktuellen oder in einem anderen Fenster) und führen Sie Folgendes aus:
export MESSAGE
Verwenden Sie beim Exportieren kein $
Zeichen.
Es wird jetzt in alle Untersitzungen exportiert. Wenn Sie echo $MESSAGE
eine Untersitzung durchführen, egal ob von Ihrem oder einem anderen Benutzer, wird diese gedruckt.
Beachten Sie, dass interne Shell-Variablen, wie z. B., PS1
nicht exportiert werden sollten. Wenn Sie sie jedoch aus einem beliebigen Grund exportieren möchten und sie nicht angezeigt werden, führen Sie sie nicht bash
nach export
, sondern nach dem Export aus bash –norc
.
4. Die $ PATH-Envar:
$PATH
ist das envar, das Benutzer normalerweise am meisten ändern.
Wenn wir echo $PATH
, werden wir diesen Stream sehen:
/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
Die gedruckten Werte dieser Variable werden dort durch Doppelpunkte (:) getrennt, aber hier ist eine möglicherweise bequemere Möglichkeit (dies sind die gleichen Werte):
/usr/local/bin
/usr/bin
/bin
/usr/local/games
/usr/games
Dies sind Verzeichnisse, nach denen gesucht werden muss, wenn ein Dienstprogramm ausgeführt wird.
Wenn Sie ausführen which echo
, erhalten Sie den Speicherort der Datei. Beispielsweise wird möglicherweise festgestellt, dass sie in vorhanden ist /bin/echo
.
Basierend darauf müssen wir nicht echo envar eingeben, um die Werte des evnar anzuzeigen. Wir können auch:
/bin/echo $ENVAR
Die envar wird weiterhin ausgeführt, zum Beispiel:
/bin/echo $HOME
Gibt uns
/home/User || /root
Genauso wie:
echo $HOME
Gibt uns
/home/User || /root
Hinweis: $HOME
wird als abgekürzt ~
.
Die System- $ PATH-Beziehungen und eine mögliche Benutzerinteraktion:
Wenn Sie in Bash 4.xx ein Dienstprogramm ohne vollständigen Pfad verwenden, verwendet das System alle sechs oben genannten Werte der $PATH
envar. Es beginnt also /user/local/bin
mit dem gesamten Inhalt, der nach der echo
ausführbaren Datei sucht .
In diesem Fall hört es bei auf /bin/echo
, in welchem Fall sich die ausführbare Datei befindet.
Daher besteht der Hauptgrund, warum wir die $PATH
envar anpassen könnten, darin, ausführbare Dateien zu installieren, die keinem ihrer nativen Werte entsprechen.
Nachdem wir solche ausführbaren Dateien installiert haben, sollten wir ihren $PATH
Wert entsprechend festlegen und dann in der Lage sein, mit ihnen zu arbeiten.
5. Anhang - erweitern $PATH
:
Wir können export $PATH
Untersitzungen (einschließlich Bash-Erweiterungen wie WP-CLI für WordPress oder Drush für Drupal) auf folgende Weise bashen:
export PATH="/home/John:$PATH"
Dies wird einen neuen Wert hinzufügen /home/John
zu $PATH
, und dann direkt danach, wird es keine nativen Werte (rechts hinter dem Doppelpunkt) annektiert, die unter der Syntax gespeichert werden $PATH
.
Eine solche dauerhafte Änderung kann im entsprechenden Skript normalerweise unter /etc/profile
und unter dem Namen vorgenommen werden .bashrc
.
exec(3)
Familienmitglieder (dh diejenigen, die nicht mit exec * v übereinstimmen) die Umgebungsbedingungen nicht erfüllen.