Was genau ist eine Umgebungsvariable?

Was genau ist eine Umgebungsvariable?

Ich weiß, dass VARIABLE=valueeine Umgebungsvariable erstellt und export VARIABLE=valuesie Prozessen zur Verfügung stellt, die von der aktuellen Shell erstellt werden. envzeigt 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 execveManpage:

ZUSAMMENFASSUNG

   #include <unistd.h>

   int execve(const char *filename, char *const argv[],
              char *const envp[]);

argvist 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. envpist 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 environzeigt auf ein Array von Zeigern auf Zeichenketten, das als „Umgebung“ bezeichnet wird. Der letzte Zeiger in diesem Array hat den Wert NULL. (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=valueerstellt eine Shell-Variable (in den meisten Shells). export SOME_NAME=valueerstellt 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/execMethode zum Starten eines neuen Prozesses, die alle Unix-Systeme verwenden. Wenn Sie exportein 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 execShell-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=valueStrings, siehe environ(7)Manpage). Andere geerbte Zustände umfassen ulimitEinstellungen, 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 execbearbeiteten Prozess geerbt wird.

Siehe die bashBeschreibung 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 cdin 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_PATHund 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 crontaboder verwenden, visudokönnen Sie die EDITORUmgebungsvariable 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 manBefehl, der Ihre Umgebung überprüft, PAGERum 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_HOMEdie gesamte Suite von Oracle-Befehlen (wie sie aus Ihrer PATHUmgebungsvariable geladen wurden) aus diesem obersten Verzeichnis abgerufen. Dasselbe gilt für andere Programme wie Java mit seiner JAVA_HOMEUmgebungsvariable.

Bash selbst besitzt zahlreiche Umgebungsvariablen, die das Verhalten verschiedener Dinge ändern können, vom Verlauf ( HISTSIZEusw. 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 ... ↑

verwandte Informationen