So legen Sie Umgebungsvariablen in Bash unter Linux fest

Unter Linux gibt es mehr als einen Typ von Umgebungsvariablen. Erfahren Sie, wie Sie sie sehen, für lokale und Remote-Logins erstellen und sie überstehen Neustarts.

Funktionsweise von Umgebungsvariablen

Wenn Sie ein Terminalfenster starten und die Schale darin, wird auf eine Sammlung von Variablen verwiesen, um sicherzustellen, dass die Shell richtig konfiguriert ist. Diese Variablen stellen auch sicher, dass alle Informationen verfügbar sind, auf die das Terminalfenster und die Shell möglicherweise verweisen müssen. Zusammen enthalten diese Variablen Einstellungen, die die Umgebung definieren, die Sie in Ihrem Terminalfenster finden, bis hin zum Aussehen der Eingabeaufforderung. Daher werden sie natürlich als Umgebungsvariablen bezeichnet.

Einige Umgebungsvariablen sind systemweit oder global. Andere sind sitzungsweit und nur für Sie sichtbar. Andere können nicht auf Ihre Sitzungsumgebungsvariablen verweisen. Es gibt einen dritten Satz von Umgebungsvariablen, der in der Shell definiert ist. Ihre Gebietsschema-, Zeitzonen- und Tastatureinstellungen, die Verzeichnisse, die durchsucht werden, wenn die Shell versucht, einen Befehl zu finden, und Ihr Standardeditor werden alle in Shell-Umgebungsvariablen gespeichert.

Wir zeigen Ihnen, wie Sie die auf Ihrem System vorhandenen Umgebungsvariablen anzeigen, und beschreiben, wie Sie Ihre eigenen erstellen. Wir zeigen Ihnen auch, wie Sie sie für untergeordnete Prozesse verfügbar machen und über Neustarts hinweg bestehen bleiben.

Umgebungen und Vererbung

Wenn eine Shell gestartet wird, durchläuft sie eine Initialisierungsphase. An diesem Punkt liest es die Umgebungsvariablen, die die Umgebung der Shell definieren.

Wenn ein Programm oder ein Befehl von dieser Shell – bekannt als Kindprozess – gestartet wird, erbt er die Umgebung des Elternprozesses – aber passen Sie auf! Wie wir sehen werden, können Sie Variablen erstellen, die nicht zu Ihrer Umgebung hinzugefügt werden, damit sie nicht von einem untergeordneten Prozess geerbt werden.

Wenn der untergeordnete Prozess eine Shell ist, wird diese Shell aus ihrem eigenen, neuen Satz von Variablen initialisiert. Wenn Sie also die Eingabeaufforderung in der aktuellen Shell ändern und dann eine untergeordnete Shell starten, erbt die untergeordnete Shell nicht die geänderte Eingabeaufforderung der übergeordneten Shell.

Globale Umgebungsvariablen

Konventionsgemäß erhalten Umgebungsvariablen Namen in Großbuchstaben. Hier sind einige der globalen Umgebungsvariablen und was die darin enthaltenen Werte darstellen:

SHELL: Der Name der Shell, die gestartet wird, wenn Sie ein Terminalfenster öffnen. Bei den meisten Linux-Distributionen das wird bash es sei denn, Sie haben die Standardeinstellung geändert.
BEGRIFF: Terminalfenster sind eigentlich Emulationen eines Hardware-Terminals. Dies enthält den Typ des Hardware-Terminals, der emuliert wird.
BENUTZER: Der Benutzername der aktuellen Person, die das System verwendet.
PWD: Der Pfad zum aktuellen Arbeitsverzeichnis.
OLDPWD: Das Verzeichnis, in dem Sie sich befanden, bevor Sie in das aktuelle Arbeitsverzeichnis verschoben wurden.
LS_COLORS: Die Liste der vom ls verwendeten Farbcodes Markieren Sie verschiedene Dateitypen.
MAIL: Wenn das Mailsystem auf Ihrem Linux-Rechner eingerichtet wurde (standardmäßig nicht), hält dies die Pfad zum Postfach des aktuellen Benutzers.
PATH: Eine Liste von Verzeichnissen, die die Shell durchsucht, um ausführbare Befehlsdateien zu finden.
LANG: Die Einstellungen für Sprache, Lokalisierung und Zeichenkodierung.
HOME: Das Home-Verzeichnis des aktuellen Benutzers.
_: Die Umgebungsvariable Unterstrich (_) enthält den zuletzt eingegebenen Befehl.

  So verwalten Sie die Bandbreite unter Linux mit Wondershaper

Wir können sehen, was einige von ihnen verwenden, um nichts ausgeklügelteres als Echo zu verwenden, das wird schreibe die Werte in das Terminalfenster. Um den Wert einer Umgebungsvariablen anzuzeigen, müssen Sie am Anfang ihres Namens ein Dollarzeichen ($) hinzufügen.

Eine nette Geste ist, dass Sie verwenden können Tab-Vervollständigung um den Umgebungsvariablennamen für Sie auszufüllen. Geben Sie ein paar Buchstaben des Namens ein und drücken Sie die Tabulatortaste. Der Name der Variablen wird von der Shell vervollständigt. Wenn dies nicht der Fall ist, müssen Sie ein paar Buchstaben mehr eingeben, um die Umgebungsvariable von anderen Befehlen mit Namen zu unterscheiden, die mit denselben Buchstaben beginnen:

echo $SHELL
echo $LANG
echo $HOME
echo $PWD

Um Ihre eigenen globalen Umgebungsvariablen zu erstellen, fügen Sie sie der Datei /etc/environment hinzu. Sie müssen sudo verwenden, um diese Datei zu bearbeiten:

sudo gedit /etc/environment

Um eine Umgebungsvariable hinzuzufügen, geben Sie ihren Namen, ein Gleichheitszeichen (=) und den Wert ein, den die Umgebungsvariable enthalten soll. Kein Leerzeichen vor oder nach dem Gleichheitszeichen (=). Der Name der Umgebungsvariablen kann Buchstaben, einen Unterstrich (_) oder Zahlen enthalten. Das erste Zeichen eines Namens darf jedoch keine Zahl sein.

Wenn der Wert Leerzeichen enthält, stellen Sie sicher, dass Sie den gesamten Wert in Anführungszeichen („).

Speichern Sie die Datei, und melden Sie sich dann ab und wieder an. Verwenden Sie echo, um zu testen, ob eine neue Variable vorhanden ist und den von Ihnen festgelegten Wert enthält:

echo $WEBSITE

Da es sich um eine globale Umgebungsvariable handelt, die für jeden verfügbar ist, kann die Benutzerin mary bei der nächsten Anmeldung auf die Umgebungsvariable verweisen:

echo $WEBSITE

Zu alle Umgebungsvariablen anzeigen Geben Sie sofort printenv ein. Es gibt viele Ausgaben, daher ist es sinnvoll, sie durch Sortieren und dann in weniger zu leiten:

printenv | sort | less

Die sortierte Liste der Umgebungsvariablen wird uns in less angezeigt.

Wir können die Ausgabe durch grep leiten, um nach Umgebungsvariablen zu suchen zu einem bestimmten Thema.

printenv | grep GNOME

Shell-Umgebungsvariablen

Dies sind einige der Shell-Umgebungsvariablen, die in der Bash verwendet werden, um ihr Verhalten und ihre Funktionalität zu diktieren oder aufzuzeichnen. Einige der Werte werden aktualisiert, während Sie das Terminal verwenden. Beispielsweise wird die Umgebungsvariable COLUMNS aktualisiert, um Änderungen widerzuspiegeln, die Sie möglicherweise an der Breite des Terminalfensters vornehmen:

BASHOPTS: Die Befehlszeilenoptionen, die beim Start von Bash verwendet wurden.
BASH_VERSION: Die Bash-Versionsnummer als Zeichenfolge aus Wörtern und Zahlen.
BASH_VERSINFO: Die Bash-Version als Ziffer.
SPALTEN: Die aktuelle Breite des Terminalfensters.
DIRSTACK: Die Verzeichnisse, die zum Verzeichnisstapel hinzugefügt durch den pushd-Befehl.
HISTFILESIZE: Maximale Anzahl von erlaubte Zeilen im Verlaufsdatei.
HISTSIZE: Anzahl der im Speicher zulässigen Verlaufszeilen.
HOSTNAME: Der Hostname des Computers.
IFS: Die Interner Feldtrenner Wird verwendet, um Eingaben in der Befehlszeile zu trennen. Standardmäßig ist dies ein Leerzeichen.
PS1: Die Umgebungsvariable PS1 enthält die Definition für die Primär-, Standard- und Eingabeaufforderung. Eine Reihe von Token, die als Escape-Sequenzen bezeichnet werden, können in die Definition Ihrer Eingabeaufforderung aufgenommen werden. Sie repräsentieren solche Dinge wie den Host- und Benutzernamen, das aktuelle Arbeitsverzeichnis und die Uhrzeit.
PS2: Wenn ein Befehl mehr als eine Zeile umfasst und mehr Eingaben erwartet werden, wird die sekundäre Eingabeaufforderung angezeigt. Die Umgebungsvariable PS2 enthält die Definition dieser sekundären Eingabeaufforderung, die standardmäßig das Größer-als-Zeichen (>) ist.
SHELLOPTS: Shell-Optionen, die Sie mit der Option set einstellen können.
UID: Die Benutzerkennung des aktuellen Benutzers.

  So senden Sie Textnachrichten unter Linux mit der Modem Manager-GUI

Lassen Sie uns einige dieser Shell-Variablen überprüfen:

echo $BASH_VERSION
echo $HOSTNAME
echo $COLUMNS
echo $HISTFILESIZE
echo $UID

Der Vollständigkeit halber sind hier die Token, die Sie in den Eingabeaufforderungsdefinitionen verwenden können:

t: Die aktuelle Uhrzeit im Format HH:MM:SS.
d: Das aktuelle Datum, ausgedrückt als Wochentag, Monat, Datum.
n: Ein Zeilenumbruchzeichen.
s: Der Name Ihrer Shell.
W: Der Name Ihres aktuellen Arbeitsverzeichnisses.
w: Der Pfad zu Ihrem aktuellen Arbeitsverzeichnis.
u: Der Benutzername der eingeloggten Person.
h: Der Hostname des Computers.
#: Jeder Befehl innerhalb einer Shell ist nummeriert. Auf diese Weise können Sie die Nummer des Befehls in Ihrer Eingabeaufforderung sehen. Dies ist nicht dieselbe Nummer wie der Befehl in der Verlaufsliste.
$: Setzt das letzte Zeichen der Eingabeaufforderung auf ein Dollarzeichen ($) für einen normalen Benutzer und ein Raute-Symbol (#) für den Root-Benutzer. Dies funktioniert, indem die UID des Benutzers überprüft wird. Wenn es null ist, ist der Benutzer root.

Sie finden die Definition Ihrer PS1-Umgebungsvariablen in Ihrer .bashrc-Datei.

Erstellen von Sitzungsumgebungsvariablen

Um Umgebungsvariablen für Ihren eigenen Gebrauch zu erstellen, fügen Sie sie am Ende Ihrer .bashrc-Datei hinzu. Wenn Sie die Umgebungsvariablen für Remote-Sitzungen verfügbar haben möchten, z. B. SSH-Verbindungen, müssen Sie sie auch zu Ihrer .bash_profile-Datei hinzufügen.

Das Format der Umgebungsvariablendefinition ist für beide Dateien gleich. Um Ihrer .bash_profile-Datei eine Definition hinzuzufügen, geben Sie dies in Ihr Home-Verzeichnis ein:

gedit .bashrc

Wir haben eine Umgebungsvariable namens INHERITED_VAR hinzugefügt. Beachten Sie das Wort „Export“ am Anfang der Zeile.

Speichern und schließen Sie Ihre Datei, nachdem Sie die Bearbeitung abgeschlossen haben. Sie können sich ab- und wieder anmelden, oder Sie können die Shell veranlassen, die .bash_profile-Datei mit dem Punktbefehl (.) wie folgt erneut zu lesen:

. .bashrc

Lassen Sie uns nun eine Umgebungsvariable in der Befehlszeile erstellen:

LOCAL_VAR="This session only"

LOCAL_VAL=

Wenn wir echo verwenden, können wir sehen, dass uns beide Umgebungsvariablen zugänglich sind:

echo $LOCAL_VAR
echo $INHERITED_VAR

Sie werden feststellen, dass die Definition der Umgebungsvariablen INHERITED_VAR das Wort „export“ am Anfang der Zeile enthält. Dies bedeutet, dass die Umgebungsvariable von Kindprozessen der aktuellen Shell geerbt wird. Wenn wir mit dem bash-Befehl eine andere starten, können wir die beiden Variablen erneut aus der untergeordneten Shell heraus überprüfen:

bash
echo $LOCAL_VAR
echo $INHERITED_VAR

Wie Sie sehen, ist INHERITED_VAR in der untergeordneten Shell zugänglich, LOCAL_VAR jedoch nicht. Wir bekommen einfach eine Leerzeile.

Obwohl „export“ den Umgebungsvariablenteil der Umgebung hinzufügt, die untergeordnete Prozesse erben, ist INHERITED_VAR keine globale Umgebungsvariable. Benutzer mary kann beispielsweise nicht darauf verweisen:

echo $INHERITED_VAR

Um unsere untergeordnete Bash-Sitzung zu schließen, verwenden wir exit:

exit

Geerbte Umgebungen wirken sich auch auf Skripte aus. Hier ist ein einfaches Skript, das die Werte unserer drei Umgebungsvariablen in das Terminalfenster schreibt:

#!/bin/bash

echo "WEBSITE" $WEBSITE
echo "LOCAL_VAR" $LOCAL_VAR
echo "INHERITED_VAR" $INHERITED_VAR

Dies wurde in einer Datei namens envtest.sh gespeichert und dann wie folgt ausführbar gemacht:

chmod +x envtest.sh

Wenn wir das Skript ausführen, kann es auf zwei von drei Umgebungsvariablen zugreifen:

./envtest.sh

Das Skript kann die globale Umgebungsvariable WEBSITE und die exportierte Umgebungsvariable INHERITED_VAR sehen. Es kann nicht auf LOCAL_VAR zugreifen, obwohl das Skript in derselben Shell ausgeführt wird, in der die Variable erstellt wurde.

  So verwenden Sie SpiderOak One unter Linux

Bei Bedarf können wir eine Umgebungsvariable über die Befehlszeile exportieren. Wir machen das mit unserem LOCAL_VAR und führen das Skript dann erneut aus:

export LOCAL_VAR
./envtest.sh

Die Umgebungsvariable wurde der Umgebung der aktuellen Shell hinzugefügt und erscheint daher in der Umgebung, die vom Skript geerbt wird. Das Skript kann auch auf diese Umgebungsvariable verweisen.

Remote-Verbindungen

Globale Umgebungsvariablen sind für Remote-Anmeldesitzungen zugänglich, aber wenn Sie möchten, dass Ihre lokal definierten Umgebungsvariablen remote verfügbar sind, müssen Sie sie Ihrer .bash_profile-Datei hinzufügen. Sie können dieselbe Umgebungsvariable in den Dateien .bashrc und .bash_profile mit unterschiedlichen Werten festlegen. Dies könnte von einem Skript erfasst werden, um beispielsweise sein Verhalten für Personen zu ändern, die das System lokal oder aus der Ferne verwenden.

(Auch auf die Gefahr hin, dass die Sache verwirrend ist, es gibt auch eine .profile-Datei. Sie kann auch Umgebungsvariablendefinitionen enthalten. Die .profile-Datei wird jedoch nicht gelesen, wenn die .bash_profile-Datei vorhanden ist. Also am sichersten – und der bash-konforme Weg ist die Verwendung der .bash_profile-Datei.)

Um die .bash_profile-Datei zu bearbeiten, verwenden wir erneut gedit:

gedit .bash_profile

Wir werden dieselbe Umgebungsvariable mit demselben Wert hinzufügen, den wir zuvor verwendet haben.

Speichern Sie Ihre Änderungen und schließen Sie gedit.

Auf einem anderen Computer erstellen wir ein SSH Verbindung zum Testrechner.

ssh [email protected]

Sobald wir verbunden sind, führen wir das Skript noch einmal aus:

./envtest.sh

Die Datei .bash_profile wurde im Rahmen der Initialisierung des Remote-Logins gelesen und die Umgebungsvariable INHERITED_VAR ist für uns und das Skript zugänglich.

Aufheben einer Umgebungsvariablen

Um eine Umgebungsvariable aufzuheben, verwenden Sie die Befehl aufheben. Wenn wir die globale Umgebungsvariable WEBSITE und die exportierte Umgebungsvariable INHERITED_VAR aufheben, sind sie weder in der Befehlszeile noch in untergeordneten Prozessen mehr verfügbar:

unset WEBSITE
unset INHERITED_VAR
./envtest.sh
echo $WEBSITE

Beachten Sie, dass dies nur die Verfügbarkeit globaler Umgebungsvariablen für Sie in dieser Sitzung ändert. Eine andere Person, die gleichzeitig angemeldet ist, kann weiterhin auf ihre Instanz dieser globalen Umgebungsvariablen zugreifen. Seine Instanz wurde während seines Anmeldevorgangs initialisiert und aus der Datei /etc/environment gelesen und ist unabhängig von der Kopie der Variablen durch andere.

Als Beispiel kann Benutzer mary immer noch auf die WEBSITE-Umgebungsvariable zugreifen und ihren Wert lesen, obwohl Benutzer dave sie in seiner Sitzung deaktiviert hat:

echo $WEBSITE

Umweltkontrolle

Umgebungsvariablen können verwendet werden, um Skripten und Anwendungen mitzuteilen, wie sie sich verhalten sollen. Sie können verwendet werden, um Einstellungen oder kleine Datenmengen zu speichern. Ein Skript kann beispielsweise eine Umgebung mit einem Wert füllen, auf den von anderen Skripten verwiesen werden kann, ohne sie in eine Datei schreiben zu müssen.