
Ich weiß, dass VARIABLE=value
eine Umgebungsvariable erstellt und export VARIABLE=value
sie Prozessen zur Verfügung stellt, die von der aktuellen Shell erstellt werden. env
zeigt die aktuellen Umgebungsvariablen an, aber wo befinden sie sich? Was umfasst eine Umgebungsvariable (oder eineUmfeld, was das betrifft)?
Antwort1
Eine Umgebung ist nicht so magisch, wie es scheint. Die Shell speichert sie im Speicher und übergibt sie an den execve()
Systemaufruf. Der untergeordnete Prozess erbt sie als Array-Zeiger namens environ
. Aus der execve
Manpage:
ZUSAMMENFASSUNG
#include <unistd.h> int execve(const char *filename, char *const argv[], char *const envp[]);
argv
ist ein Array von Argumentzeichenfolgen, die an das neue Programm übergeben werden.
Gemäß Konvention sollte die erste dieser Zeichenfolgen den Dateinamen enthalten, der mit der ausgeführten Datei verknüpft ist.envp
ist ein Array von Zeichenfolgen, üblicherweise in der Form Schlüssel=Wert, die als Umgebung an das neue Programm übergeben werden.
Die environ(7)
Manpage bietet auch einige Einblicke:
ZUSAMMENFASSUNG
extern char **environ;
BESCHREIBUNG
Die Variable
environ
zeigt auf ein Array von Zeigern auf Zeichenketten, das als „Umgebung“ bezeichnet wird. Der letzte Zeiger in diesem Array hat den WertNULL
. (Diese Variable muss im Benutzerprogramm deklariert werden, wird aber in der Header-Datei deklariert,<unistd.h>
falls die Header-Dateien von libc4 oder libc5 stammen und falls sie von glibc stammen und _GNU_SOURCE definiert wurde.) Dieses Array von Zeichenketten wird dem Prozess durch den exec(3)-Aufruf zur Verfügung gestellt, der den Prozess gestartet hat.
Beide dieser GNU-Manpages entsprechen denPOSIX-Spezifikation
Antwort2
Sie haben es ein wenig falsch verstanden: SOME_NAME=value
erstellt eine Shell-Variable (in den meisten Shells). export SOME_NAME=value
erstellt eine Umgebungsvariable. Ob gut oder schlecht, die meisten Unix/Linux/*BSD-Shells verwenden die gleiche Syntax für den Zugriff auf Umgebungsvariablen und Shell-Variablen.
In einem größeren Sinne ist eine „Umgebung“ einfach die Information, die mit der Programmausführung einhergeht. In C-Programmen finden Sie die Prozess-ID möglicherweise bei einem getpid()
Aufruf, in einem Shell-Programm würden Sie einen Variablenzugriff verwenden: $$
. Die Prozess-ID ist einfach Teil der Programmumgebung. Ich glaube, der Begriff „Umgebung“ stammt aus einigen eher theoretischen Informatikthemen, wie der Modellierung der Programmausführung. Modelle der Programmausführung haben eineUmfeld"das die Assoziationen zwischen Variablen und ihren Werten enthält".
Und diese letztere, stärkere Definition ist das, was eine „Umgebung“ für Unix/Linux/*BSD-Shells ist: eine Verbindung zwischen Namen („Variablen“) und ihren Werten. Bei den meisten Shells im Unix-Stil sind die Werte alle Zeichenfolgen, obwohl das nicht mehr so streng zutrifft wie früher. Ksh, Zsh und Bash haben heutzutage alle typisierte Variablen. Sogar Shell-Funktionsdefinitionen können exportiert werden.
Die Verwendung einer Umgebung, die von einfachen Shell-Variablen getrennt ist, umfasst die fork/exec
Methode zum Starten eines neuen Prozesses, die alle Unix-Systeme verwenden. Wenn Sie export
ein Name/Wert-Paar verwenden, ist dieses Name/Wert-Paar in der Umgebung neuer ausführbarer Dateien vorhanden, die von der Shell mit einem execve(2)
Systemaufruf gestartet werden (normalerweise nach einem fork(2)
, außer wenn der exec
Shell-Befehl verwendet wurde).
Nach einem hat execve()
die main()
Funktion der neuen Binärdatei ihre Befehlszeilenargumente, die Umgebung (gespeichert als NULL-terminiertes Array von Zeigern auf var=value
Strings, siehe environ(7)
Manpage). Andere geerbte Zustände umfassen ulimit
Einstellungen, das aktuelle Arbeitsverzeichnis und alle offenen Dateideskriptoren, für die der execve()
Anrufer kein FD_CLOEXEC gesetzt hat. Der aktuelle Zustand des TTY (Echo aktiviert, Raw-Modus usw.) könnte auch als Teil des Ausführungszustands betrachtet werden, der von einem neu exec
bearbeiteten Prozess geerbt wird.
Siehe die bash
Beschreibung im Handbuch desAusführungsumgebungfür einfache Befehle (außer integrierten oder Shell-Funktionen).
Die Unix-Umgebung unterscheidet sich von zumindest einigen anderen Betriebssystemen: VMS-„Lexika“ konnten von einem untergeordneten Prozess geändert werden, und diese Änderung war im übergeordneten Prozess sichtbar. Ein VMS cd
in einem untergeordneten Prozess würde das Arbeitsverzeichnis des übergeordneten Prozesses beeinflussen. Zumindest unter bestimmten Umständen, und mein Gedächtnis lässt mich vielleicht im Stich.
Einige Umgebungsvariablen sind wohlbekannt, $HOME
, $PATH
, $LD_LIBRARY_PATH
und andere. Manche sind für ein bestimmtes Programmiersystem üblich, sodass eine übergeordnete Shell sehr viele spezielle Informationen an ein Programm weitergeben kann, wie z. B. ein bestimmtes temporäres Verzeichnis oder eine Benutzer-ID und ein Passwort, die in nicht auftauchen ps -ef
. Einfache CGI-Programme erben beispielsweise viele Informationen vom Webserver über Umgebungsvariablen.
Antwort3
Umgebungsvariablen sind in ihrer einfachsten Form nur eine Reihe von Name/Wert-Paaren. Wie in der Manpage von Bash ( man 1 bash
) im Abschnitt UMWELT beschrieben:
When a program is invoked it is given an array of strings called the
environment. This is a list of name-value pairs, of the form
name=value.
The shell provides several ways to manipulate the environment. On
invocation, the shell scans its own environment and creates a parameter
for each name found, automatically marking it for export to child pro-
cesses. Executed commands inherit the environment.
In der Praxis können Sie damit ein Verhalten definieren, das für alle Programme gilt, die von der aktuellen Shell aufgerufen werden. Wenn Sie beispielsweise crontab
oder verwenden, visudo
können Sie die EDITOR
Umgebungsvariable so definieren, dass ein anderer Editor als derjenige definiert wird, den Ihr System standardmäßig verwenden würde. Dasselbe gilt für Dinge wie den man
Befehl, der Ihre Umgebung überprüft, PAGER
um herauszufinden, welches Pager-Programm zum Anzeigen der Ausgabe der Manpage verwendet werden soll.
Viele Unix-Befehle lesen die Umgebung und ändern je nach den dortigen Einstellungen ihre Ausgabe/Verarbeitung/Aktion. Manche werden gemeinsam genutzt, andere sind programmspezifisch. Die meisten Manpages enthalten Informationen darüber, wie sich die Umgebungsvariablen auf das beschriebene Programm auswirken.
Andere praktische Beispiele sind Systeme mit mehreren Oracle-Installationen auf derselben Plattform. Durch Festlegen von wird ORACLE_HOME
die gesamte Suite von Oracle-Befehlen (wie sie aus Ihrer PATH
Umgebungsvariable geladen wurden) aus diesem obersten Verzeichnis abgerufen. Dasselbe gilt für andere Programme wie Java mit seiner JAVA_HOME
Umgebungsvariable.
Bash selbst besitzt zahlreiche Umgebungsvariablen, die das Verhalten verschiedener Dinge ändern können, vom Verlauf ( HISTSIZE
usw. HISTFILE
), über die Bildschirmgröße ( COLUMNS
), die Tab-Vervollständigung ( FIGNORE
, GLOBIGNORE
), das Gebietsschema und die Zeichenkodierung/-dekodierung ( LANG
, LC_*
), die Eingabeaufforderung ( PS1
.. PS4
) usw. (schlagen Sie auch hier die Informationen auf der Manpage von Bash vor).
Sie können auch Skripte/Programme schreiben, die Ihre eigenen benutzerdefinierten Umgebungsvariablen verwenden (um Einstellungen weiterzugeben oder die Funktionalität zu ändern).
Antwort4
"Umgebungsvariablen"sind eine Reihe dynamischer benannter Werte, die das Verhalten laufender Prozesse auf einem Computer beeinflussen können.
Sie sind Teil der Betriebsumgebung, in der ein Prozess ausgeführt wird. Ein laufender Prozess kann beispielsweise den Wert der Umgebungsvariable TEMP abfragen, um einen geeigneten Speicherort für temporäre Dateien zu finden, oder die Variable HOME oder USERPROFILE abfragen, um die Verzeichnisstruktur zu finden, die dem Benutzer gehört, der den Prozess ausführt.
Mehr Infos hier →http://en.wikipedia.org/wiki/Umweltvariable.
Alles, was Sie über Umgebungsvariablen wissen möchten ... ↑