Linux/Umgebung/Variable: Unterschied zwischen den Versionen

Aus Foxwiki
Zeile 34: Zeile 34:


= TMP =
= TMP =
== General ==
== Allgemein ==
Environment variables ([[DebianMan:7/environ|environ(7)]]) are named strings available to all applications. Variables are used to adapt each application's behavior to the environment it is running in. You might define paths for files, language options, and so on. You can see each application's manual to see what variables are used by that application.
Umgebungsvariablen ([[DebianMan:7/environ|environ(7)]]) sind benannte Zeichenketten, die für alle Anwendungen verfügbar sind. Variablen werden verwendet, um das Verhalten jeder Anwendung an die Umgebung, in der sie läuft, anzupassen. Sie können Pfade für Dateien, Sprachoptionen und so weiter definieren. Sie können im Handbuch jeder Anwendung nachlesen, welche Variablen von dieser Anwendung verwendet werden.


That said, there are several standard variables in Linux environments:
Es gibt jedoch einige Standardvariablen in Linux-Umgebungen:
  * PATH = Colon separated list of directories to search for commands.
  * PATH = Durch Doppelpunkt getrennte Liste von Verzeichnissen, in denen nach Befehlen gesucht wird.
  * HOME = Current user's home directory.
  * HOME = Das Heimatverzeichnis des aktuellen Benutzers.
  * LOGNAME = Current user's name.
  * LOGNAME = Der Name des aktuellen Benutzers.
  * SHELL = The user's preferred shell.
  * SHELL = Die bevorzugte Shell des Benutzers.
  * EDITOR = The user's preferred text editor.
  * EDITOR = Der bevorzugte Texteditor des Benutzers.
  * MAIL = The user's electronic mail inbox location.
  * MAIL = Der Ort des elektronischen Posteingangs des Benutzers.


To see your currently defined variables, open up your terminal and type the `env` command.
Um Ihre aktuell definierten Variablen zu sehen, öffnen Sie Ihr Terminal und geben Sie den Befehl `env` ein.


Variables are defined with name-value pairs: `NAME=any string as value`. The variable name is usually in capital letters. Anything that follows the equal-sign is considered the variable's value until the terminating line feed character. Variables can be defined ''ad hoc'' in a terminal by writing the appropriate command. In Bash this would be `export MYVAL="Hello world"`. In this case the variable stays defined until the end of the terminal session.
Variablen werden mit Name-Wert-Paaren definiert: `NAME=beliebige Zeichenkette als Wert`. Der Variablenname wird normalerweise in Großbuchstaben geschrieben. Alles, was auf das Gleichheitszeichen folgt, gilt als Wert der Variable bis zum abschließenden Zeilenvorschubzeichen. Variablen können ''ad hoc'' in einem Terminal definiert werden, indem man den entsprechenden Befehl schreibt. In Bash wäre dies `export MYVAL="Hello world"`. In diesem Fall bleibt die Variable bis zum Ende der Terminalsitzung definiert.


If you want to append something to a variable, instead of overwriting the previous value, include the variable name into the new definition. E.g. in Bash: `export PATH=$PATH:~/bin`. This example shows how to append the bin directory in the user's home directory onto the PATH environment variable.
Wenn Sie etwas an eine Variable anhängen wollen, anstatt den vorherigen Wert zu überschreiben, fügen Sie den Variablennamen in die neue Definition ein. Z.B. in der Bash: `export PATH=$PATH:~/bin`. Dieses Beispiel zeigt, wie man das Verzeichnis bin im Heimatverzeichnis des Benutzers an die Umgebungsvariable PATH anhängt.


In most cases it is most convenient to store these variables in a configuration file that is read during system boot and user login so that they are available automatically. Unfortunately this not always as easy as it sounds. Why? For a couple of reasons:
In den meisten Fällen ist es am praktischsten, diese Variablen in einer Konfigurationsdatei zu speichern, die beim Systemstart und bei der Benutzeranmeldung gelesen wird, so dass sie automatisch verfügbar sind. Leider ist dies nicht immer so einfach, wie es klingt. Und warum? Dafür gibt es mehrere Gründe:
  1. Most programs don't read a configuration file to set their environment; instead, they inherit it from a parent process. You need to configure the parent's settings so that it passes them on for all its children.
  1. Die meisten Programme lesen keine Konfigurationsdatei, um ihre Umgebung einzustellen; stattdessen erben sie diese von einem übergeordneten Prozess. Sie müssen die Einstellungen des Elternprozesses so konfigurieren, dass er sie an alle seine Kinder weitergibt.
  1. Various shells and window managers are often the parent programs we are looking for, but each of them reads a different configuration file (dot file) when it starts.
  1. Verschiedene Shells und Fenstermanager sind oft die Elternprogramme, nach denen wir suchen, aber jedes von ihnen liest eine andere Konfigurationsdatei (Dot-Datei), wenn es startet.
  1. Some Desktop Environments launch programs through an auxiliary service, and therefore the window manager may not be the parent program we're looking for.
  1. Einige Desktop-Umgebungen starten Programme über einen Hilfsdienst, so dass der Fenstermanager möglicherweise nicht das gesuchte übergeordnete Programm ist.


So, with this knowledge we understand that we need to consider both the starting order of system processes and the configuration files they read when they are started. See the DotFiles page, or read on ...
Mit diesem Wissen wissen wir nun, dass wir sowohl die Startreihenfolge der Systemprozesse als auch die Konfigurationsdateien, die sie beim Start lesen, berücksichtigen müssen. Siehe die Seite DotFiles, oder lesen Sie weiter ...


Let's get to it! There are several ways you can access your Linux box: from a text console, from a graphical login (Display Manager), or using remote ssh.
Legen wir los! Es gibt mehrere Möglichkeiten, auf Ihren Linux-Rechner zuzugreifen: über eine Textkonsole, über eine grafische Anmeldung (Display Manager) oder über Remote-SH.


== Using text console or remote ssh ==
== Textkonsole oder entfernte ssh verwenden ==
Text console logins and remote ssh logins both end up with a ''login shell''.  Variables are acquired in stages, by multiple processes in sequenceEach process adds some more variables.
Sowohl die Anmeldung über die Textkonsole als auch die Fernanmeldung über ssh enden mit einer ''Login-Shell''.  Die Variablen werden schrittweise von mehreren Prozessen nacheinander erworbenJeder Prozess fügt einige weitere Variablen hinzu.
  1. At the end of boot the mother of all processes `init` is started. `init`'s environment, including PATH, is defined in its source code and cannot be changed at run time.
  1. Am Ende des Bootvorgangs wird die Mutter aller Prozesse `init` gestartet. Die Umgebung von `init`, einschließlich PATH, ist in seinem Quellcode definiert und kann zur Laufzeit nicht geändert werden.
  1. `init` runs the start-up scripts from `/lib/systemd/system` (under systemd) or `/etc/rc?.d` based on the run level set in `/etc/inittab` (under sysvinit). Each service or script defines its own required environment variables. Under systemd, variables defined in various `environment.d` directories will be made available to systemd user units; see the [[DebianMan:5/environment.d|environment.d(5)]] manual page for details.
  1. `init` führt die Startskripte aus `/lib/systemd/system` (unter systemd) oder `/etc/rc?.d` aus, basierend auf dem in `/etc/inittab` (unter sysvinit) eingestellten Runlevel. Jeder Dienst oder jedes Skript definiert seine eigenen benötigten Umgebungsvariablen. Unter systemd werden Variablen, die in verschiedenen `environment.d`-Verzeichnissen definiert sind, den systemd-Benutzereinheiten zur Verfügung gestellt; siehe die [[DebianMan:5/environment.d|environment.d(5)]]-Manualseite für Details.
  1. At the end of booting, `init` runs a `getty` process on one or more virtual consoles.  `getty` waits for the user to type their name, after which it sets the `TERM` variable and executes `login` to prompt for a password.
  1. Am Ende des Bootens führt `init` einen `getty`-Prozess auf einer oder mehreren virtuellen Konsolen aus.  `getty` wartet darauf, dass der Benutzer seinen Namen eingibt, setzt dann die Variable `TERM` und führt `login` aus, um nach einem Passwort zu fragen.
  1. `login` checks `/etc/passwd` and `/etc/shadow` for the user's account detailsIf the password is acceptable, `login` sets `HOME`, `SHELL`, `PATH`, `LOGNAME` and `MAIL` based on the contents of `/etc/passwd`, checks PAM, and finally runs the user's login shell.
  1. `login` überprüft `/etc/passwd` und `/etc/shadow` auf die Kontodaten des BenutzersWenn das Passwort akzeptabel ist, setzt `login` `HOME`, `SHELL`, `PATH`, `LOGNAME` und `MAIL` basierend auf dem Inhalt von `/etc/passwd`, überprüft PAM und führt schließlich die Login-Shell des Benutzers aus.
   a. PAM may instruct `login` to read the variables in `/etc/environment` also. This is the default.
   a. PAM kann `login` anweisen, auch die Variablen in `/etc/environment` zu lesen. Dies ist die Voreinstellung.
  1. The login shell starts and reads its shell-specific configuration files.
  1. Die Login-Shell startet und liest ihre shellspezifischen Konfigurationsdateien.
   a. DebianPkg:bash first reads `/etc/profile` to get values that are defined for all users. After reading that file, it looks for `~/.bash_profile`, `~/.bash_login`, and `~/.profile`, in that order, and reads and executes commands from the first of these files that exists and is readableSee DotFiles for full details.
   a. DebianPkg:bash liest zuerst `/etc/profile`, um Werte zu erhalten, die für alle Benutzer definiert sind. Nachdem sie diese Datei gelesen hat, sucht sie nach `~/.bash_profile`, `~/.bash_login` und `~/.profile`, in dieser Reihenfolge, und liest und führt Befehle aus der ersten dieser Dateien, die existiert und lesbar ist, ausSiehe DotFiles für weitere Details.
   a. (please fill in other shells as well)
   a. (bitte geben Sie auch andere Shells an)


For ssh logins, the chain is similar. The `init` system runs the `sshd` service, which listens for remote client connections.
Für ssh-Anmeldungen ist die Kette ähnlich. Das `init`-System führt den `sshd`-Dienst aus, der auf entfernte Client-Verbindungen wartet.
  1. `sshd` has a starting environment defined by its service file.
  1. `sshd` hat eine Startumgebung, die durch seine Servicedatei definiert ist.
  1. PAM may supply additional variables.
  1. PAM kann zusätzliche Variablen bereitstellen.
  1. `/etc/ssh/sshd_config` defines additional environment variables that may be accepted from the client.
  1. `/etc/ssh/sshd_config` definiert zusätzliche Umgebungsvariablen, die vom Client akzeptiert werden können.
  1. After authentication, sshd runs a login shell, which reads its shell-specific dot files as indicated above.
  1. Nach der Authentifizierung führt sshd eine Login-Shell aus, die ihre shellspezifischen Dot-Dateien wie oben angegeben liest.


Now the environment variables are ready to be used by the applications you start from the shell.
Nun sind die Umgebungsvariablen bereit, von den Anwendungen verwendet zu werden, die Sie von der Shell aus starten.


== Using graphical display manager ==
== Verwendung eines grafischen Anzeigemanagers ==
The login process is quite different under a DisplayManager.
Der Anmeldevorgang ist unter einem DisplayManager ganz anders.
  1. At the end of booting, the mother of all processes -- `init` -- is started.
  1. Am Ende des Bootens wird die Mutter aller Prozesse -- `init` -- gestartet.
  1. `init` runs services as described aboveOne of these services will be your display manager.
  1. `init` führt Dienste wie oben beschrieben ausEiner dieser Dienste wird Ihr DisplayManager sein.
  1. When the user successfully logs in, the display manager checks PAM, and then starts an [[Xsession]].
  1. Wenn sich der Benutzer erfolgreich anmeldet, prüft der Display-Manager PAM und startet dann eine [[Xsession]].
   a. PAM may instruct the DM to read the variables from `/etc/environment`.
   a. PAM kann den DM anweisen, die Variablen aus `/etc/environment` zu lesen.
  1. The Xsession reads `~/.xsessionrc` and possibly other files depending on the session type.
  1. Die Xsession liest `~/.xsessionrc` und möglicherweise andere Dateien, abhängig vom Sitzungstyp.


Whether shell's startup files (`/etc/profile` and `~/.profile` and so on) have an effect during graphical logins depends on the DisplayManager. For example [[SDDM]] loads them by default while they ignored by [[LightDM]] out of the box configuration in Debian. A user may choose to create a `~/.xsessionrc` file which reads these files.
Ob die Startdateien der Shell (`/etc/profile` und `~/.profile` und so weiter) bei grafischen Anmeldungen eine Wirkung haben, hängt vom DisplayManager ab. Zum Beispiel lädt [[SDDM]] sie standardmäßig, während sie von [[LightDM]] in der Debian-Konfiguration ignoriert werden. Ein Benutzer kann eine `~/.xsessionrc`-Datei erstellen, die diese Dateien liest.


== Desktop Environments and systemd user services ==
== Desktop-Umgebungen und systemd-Benutzerdienste ==
Some Desktop Environments launch programs via systemd user services. These programs do not inherit their environment from the X session. To configure the environment for such programs, one must configure the `systemd --user` daemon.
Einige Desktop-Umgebungen starten Programme über systemd-Benutzerdienste. Diese Programme erben ihre Umgebung nicht von der X-Sitzung. Um die Umgebung für solche Programme zu konfigurieren, muss man den Daemon `systemd --user` konfigurieren.


This may be done as follows:
Dies kann wie folgt geschehen:
  * `mkdir -p ~/.config/systemd/user/service.d`
  * `mkdir -p ~/.config/systemd/user/service.d`
  * Use your preferred text editor to create a file inside this directory. The filename must end with `.conf` or it won't be recognized. Let's say you use `env.conf` as your filename. Inside the `env.conf` file, place the following lines:
  * Verwenden Sie Ihren bevorzugten Texteditor, um eine Datei in diesem Verzeichnis zu erstellen. Der Dateiname muss mit `.conf` enden, sonst wird er nicht erkannt. Nehmen wir an, Sie verwenden `env.conf` als Dateinamen. Fügen Sie innerhalb der Datei `env.conf` die folgenden Zeilen ein:
  . {{{
  . {{{
[Service]
[Service]
Environment="MYVAR=some value"
Umgebung="MYVAR=irgendein Wert"
}}}
}}}
  * For a list of escape sequences that may be used in this file, see [[DebianMan:systemd.unit#SPECIFIERS|systemd.unit(5)]].
  * Für eine Liste von Escape-Sequenzen, die in dieser Datei verwendet werden können, siehe [[DebianMan:systemd.unit#SPECIFIERS|systemd.unit(5)]].
  * `systemctl --user daemon-reload`
  * '''systemctl --user daemon-reload'''
  * In some Desktop Environments, you may also need to restart a launcher or menu service, or perhaps log out and back in.
  * In einigen Desktop-Umgebungen müssen Sie möglicherweise auch einen Start- oder Menüdienst neu starten oder sich ab- und wieder anmelden.


You may supply more than one environment variable, and you may also configure umask or resource limits here (see [[Permissions#Setting_default_umask|Setting default umask]] for details). You may have multiple files, or one file with multiple entries, as you see fit.
Sie können mehr als eine Umgebungsvariable angeben, und Sie können hier auch umask oder Ressourcenlimits konfigurieren (siehe [[Berechtigungen#Standardumask setzen|Standardumask setzen]] für Details). Sie können mehrere Dateien haben, oder eine Datei mit mehreren Einträgen, wie Sie es für richtig halten.


[[DebianMan:environment.d|environment.d(5)]] provides another way to accomplish this, but it's limited strictly to environment variables (no umask or resource limits), and uses a different syntax. It also does not support the Specifiers (%h, etc.) that systemd.unit(5) defines, but instead has a pseudo shell variable expansion syntax.
[[DebianMan:environment.d|environment.d(5)]] bietet eine weitere Möglichkeit, dies zu erreichen, aber sie ist strikt auf Umgebungsvariablen beschränkt (keine umask oder Ressourcenbeschränkungen) und verwendet eine andere Syntax. Es unterstützt auch nicht die Spezifizierer (%h, etc.), die systemd.unit(5) definiert, sondern hat stattdessen eine Pseudo-Shellvariablen-Expansionssyntax.


== Quick guide ==
== Kurzanleitung ==
For the hasty who just need to get the system running, here is what you can do:
Für die Eiligen, die das System einfach nur zum Laufen bringen müssen, können Sie folgendes tun:


  * Put all global environment variables, i.e. ones affecting all users, into '''/etc/environment'''
  * Legen Sie alle globalen Umgebungsvariablen, d.h. diejenigen, die alle Benutzer betreffen, in '''/etc/environment''' ab.
   * Remember, this file is read by PAM, ''not'' by a shellYou cannot use shell expansions hereE.g. `MAIL=$HOME/Maildir/` will not work!
   * Denken Sie daran, dass diese Datei von PAM gelesen wird, ''nicht'' von einer ShellSie können hier keine Shell-Erweiterungen verwendenZ.B. `MAIL=$HOME/Maildir/` wird nicht funktionieren!
   * There is '''no''' shell-agnostic and login-independent solution to the problem of how to configure the environment for all users, beyond the trivial cases that PAM can handle.
   * Es gibt '''keine''' shell-agnostische und login-unabhängige Lösung für das Problem, wie man die Umgebung für alle Benutzer konfiguriert, abgesehen von den trivialen Fällen, die PAM handhaben kann.
  * Put all your transient shell settings (aliases, functions, shell options) in '''~/.bashrc'''
  * Legen Sie alle Ihre vorübergehenden Shell-Einstellungen (Aliase, Funktionen, Shell-Optionen) in '''~/.bashrc''' ab.
  * Put all your environment variables in '''~/.profile'''
  * Legen Sie alle Ihre Umgebungsvariablen in '''~/.profile''' ab.
  * Create or edit file '''~/.bash_profile''' and include commands:
  * Erstellen oder bearbeiten Sie die Datei '''~/.bash_profile''' und fügen Sie Befehle ein:
  {{{
  {{{
  if [ -f ~/.profile ]; then
  if [ -f ~/.profile ]; then
Zeile 121: Zeile 121:
  fi
  fi
  }}}
  }}}
  * Create or edit file '''~/.xsessionrc''' and include the same commands as above.
  * Erstellen oder bearbeiten Sie die Datei '''~/.xsessionrc''' und fügen Sie die gleichen Befehle wie oben ein.
  * If you use a Desktop Environment, create an `env.conf` file as shown in the previous section.
  * Wenn Sie eine Desktop-Umgebung verwenden, erstellen Sie eine Datei '''env.conf''', wie im vorherigen Abschnitt gezeigt.


This is a quick and dirty approachNot for the pedantic user.
Dies ist ein schneller und schmutziger AnsatzNicht für den pedantischen Benutzer.


== Notes and exceptions ==
== Hinweise und Ausnahmen ==


=== SysV, Systemd and init ===
=== SysV, Systemd und init ===


According to GW at [[https://lists.debian.org/debian-user/2023/10/msg00826.html|Re: PATH revisited: one PATH to "rule the [Debian] World"]], `/sbin/init` is what gets executed by the kernel, regardless of what init system is installed.
Laut GW in [[https://lists.debian.org/debian-user/2023/10/msg00826.html|Re: PATH revisited: one PATH to rule the [Debian] World"]] ist `/sbin/init` das, was vom Kernel ausgeführt wird, unabhängig davon, welches Init-System installiert ist.


{{{
{{{
$ ps -fp 1
$ ps -fp 1
UID         PID   PPID C STIME TTY         TIME CMD
UID PID PPID C STIME TTY TIME CMD
root           1       0 0 Oct07 ?        00:01:58 /sbin/init
root 1 0 0 Okt07 ?        00:01:58 /sbin/init


$ ls -l /sbin/init
$ ls -l /sbin/init
Zeile 141: Zeile 141:
}}}
}}}


=== startx from terminal ===
=== startx vom Terminal aus starten ===
If you start X Window (the GUI) from a text console, your environment variables are already defined by your login shell, as explained above. However, the window manager may read the same files again (see below). This is usually not a problem, but you may get unexpected results, such as PATH having all entries listed twice.
Wenn Sie X Window (die grafische Benutzeroberfläche) von einer Textkonsole aus starten, sind Ihre Umgebungsvariablen bereits von Ihrer Login-Shell definiert, wie oben erläutert. Allerdings kann es sein, dass der Window-Manager dieselben Dateien erneut einliest (siehe unten). Dies ist normalerweise kein Problem, aber Sie können unerwartete Ergebnisse erhalten, wie z.B. dass alle Einträge in PATH doppelt aufgeführt sind.


=== Shell cascading ===
=== Shell-Kaskadierung ===
If you start another shell within the login shell (yes it is possible), the second one is a non-login shell. It will not read named start-up files but searches non-login start-up script from user's home directory instead. With Bash it is called `~/.bashrc`. To avoid specifying same values in two places usually the login-shell start-up script `~/.bash_profile` includes the `~/.bashrc` at the end of its execution. To implement include following into your `~/.bash_profile`:
Wenn Sie innerhalb der Login-Shell eine weitere Shell starten (ja, das ist möglich), ist die zweite Shell eine Nicht-Login-Shell. Sie liest keine benannten Startdateien, sondern sucht stattdessen das Nicht-Login-Startskript aus dem Home-Verzeichnis des Benutzers. Bei der Bash heißt es `~/.bashrc`. Um zu vermeiden, dass dieselben Werte an zwei Stellen angegeben werden, schließt das Startskript der Login-Shell `~/.bash_profile` am Ende seiner Ausführung die `~/.bashrc` ein. Zur Implementierung fügen Sie folgendes in Ihr `~/.bash_profile` ein:
{{{
{{{
if [ -f ~/.bashrc ]; then
if [ -f ~/.bashrc ]; then
Zeile 152: Zeile 152:
}}}
}}}


=== Terminal windows in X ===
=== Terminal-Fenster in X ===
If you start terminal / console window in graphical desktop environment it will be non-login terminal and it will read only the user's non-login start-up script. For Bash this is `~/.bashrc`.
Wenn Sie ein Terminal-/Konsolenfenster in einer grafischen Desktop-Umgebung starten, ist es ein Nicht-Login-Terminal und liest nur das Nicht-Login-Startskript des Benutzers. Für Bash ist dies `~/.bashrc`.


=== Using su ===
=== Verwendung von su ===
The `su` command is used to become another user during a login session. It is commonly used to get root permissions temporarily from normal session. In [[DebianStretch|Stretch]] and earlier releases, the `su` command resets your PATH environment value to one defined in `/etc/login.defs` by  ENV_PATH and ENV_SUPATH variables.  In [[DebianBuster|Buster]] and later releases, `su` does not change your PATH variable by default (for details, see `/usr/share/doc/util-linux/NEWS.Debian.gz`). You may tell it to do so by creating the file `/etc/default/su` and putting the line `ALWAYS_SET_PATH yes` in it.
Der Befehl `su` wird verwendet, um während einer Login-Sitzung ein anderer Benutzer zu werden. Er wird üblicherweise verwendet, um vorübergehend Root-Rechte von einer normalen Sitzung zu erhalten. In [[DebianStretch|Stretch]] und früheren Versionen setzt der `su`-Befehl Ihren PATH-Umgebungswert auf einen Wert zurück, der in `/etc/login.defs` durch die Variablen ENV_PATH und ENV_SUPATH definiert ist.  In [[DebianBuster|Buster]] und späteren Versionen ändert `su` Ihre PATH-Variable standardmäßig nicht (für Details, siehe `/usr/share/doc/util-linux/NEWS.Debian.gz`). Sie können es anweisen, dies zu tun, indem Sie die Datei `/etc/default/su` erstellen und die Zeile `ALWAYS_SET_PATH yes` darin einfügen.


Please note that using Gnome helper `gksu` from Gnome panel by default uses `su` internally (i.e. you may "lose" your PATH if you do not configure it in login.defs in stretch).
Bitte beachten Sie, dass der Gnome-Helfer `gksu` aus dem Gnome-Panel standardmäßig `su` intern verwendet (d.h. Sie könnten Ihren PATH "verlieren", wenn Sie ihn nicht in login.defs in stretch konfigurieren).
  . ''Does this mean gksu simply fails outright in buster due to the missing /sbin et al. in PATH?''
  . ''Bedeutet das, dass gksu in buster aufgrund des fehlenden /sbin u.a. im PATH schlichtweg versagt?''


----
----
CategorySystemAdministration
KategorieSystemadministration
</noinclude>
</noinclude>



Version vom 7. August 2024, 08:14 Uhr

topic - Kurzbeschreibung

Beschreibung

Installation

Syntax

Optionen

Parameter

Umgebungsvariablen

Exit-Status

Anwendung

Fehlerbehebung

Konfiguration

Dateien

Anhang

Siehe auch

Dokumentation

RFC
RFC Titel
0000
Man-Pages
Info-Pages

Links

Projekt
Weblinks

TMP

Allgemein

Umgebungsvariablen (environ(7)) sind benannte Zeichenketten, die für alle Anwendungen verfügbar sind. Variablen werden verwendet, um das Verhalten jeder Anwendung an die Umgebung, in der sie läuft, anzupassen. Sie können Pfade für Dateien, Sprachoptionen und so weiter definieren. Sie können im Handbuch jeder Anwendung nachlesen, welche Variablen von dieser Anwendung verwendet werden.

Es gibt jedoch einige Standardvariablen in Linux-Umgebungen:

* PATH = Durch Doppelpunkt getrennte Liste von Verzeichnissen, in denen nach Befehlen gesucht wird.
* HOME = Das Heimatverzeichnis des aktuellen Benutzers.
* LOGNAME = Der Name des aktuellen Benutzers.
* SHELL = Die bevorzugte Shell des Benutzers.
* EDITOR = Der bevorzugte Texteditor des Benutzers.
* MAIL = Der Ort des elektronischen Posteingangs des Benutzers.

Um Ihre aktuell definierten Variablen zu sehen, öffnen Sie Ihr Terminal und geben Sie den Befehl `env` ein.

Variablen werden mit Name-Wert-Paaren definiert: `NAME=beliebige Zeichenkette als Wert`. Der Variablenname wird normalerweise in Großbuchstaben geschrieben. Alles, was auf das Gleichheitszeichen folgt, gilt als Wert der Variable bis zum abschließenden Zeilenvorschubzeichen. Variablen können ad hoc in einem Terminal definiert werden, indem man den entsprechenden Befehl schreibt. In Bash wäre dies `export MYVAL="Hello world"`. In diesem Fall bleibt die Variable bis zum Ende der Terminalsitzung definiert.

Wenn Sie etwas an eine Variable anhängen wollen, anstatt den vorherigen Wert zu überschreiben, fügen Sie den Variablennamen in die neue Definition ein. Z.B. in der Bash: `export PATH=$PATH:~/bin`. Dieses Beispiel zeigt, wie man das Verzeichnis bin im Heimatverzeichnis des Benutzers an die Umgebungsvariable PATH anhängt.

In den meisten Fällen ist es am praktischsten, diese Variablen in einer Konfigurationsdatei zu speichern, die beim Systemstart und bei der Benutzeranmeldung gelesen wird, so dass sie automatisch verfügbar sind. Leider ist dies nicht immer so einfach, wie es klingt. Und warum? Dafür gibt es mehrere Gründe:

1. Die meisten Programme lesen keine Konfigurationsdatei, um ihre Umgebung einzustellen; stattdessen erben sie diese von einem übergeordneten Prozess. Sie müssen die Einstellungen des Elternprozesses so konfigurieren, dass er sie an alle seine Kinder weitergibt.
1. Verschiedene Shells und Fenstermanager sind oft die Elternprogramme, nach denen wir suchen, aber jedes von ihnen liest eine andere Konfigurationsdatei (Dot-Datei), wenn es startet.
1. Einige Desktop-Umgebungen starten Programme über einen Hilfsdienst, so dass der Fenstermanager möglicherweise nicht das gesuchte übergeordnete Programm ist.

Mit diesem Wissen wissen wir nun, dass wir sowohl die Startreihenfolge der Systemprozesse als auch die Konfigurationsdateien, die sie beim Start lesen, berücksichtigen müssen. Siehe die Seite DotFiles, oder lesen Sie weiter ...

Legen wir los! Es gibt mehrere Möglichkeiten, auf Ihren Linux-Rechner zuzugreifen: über eine Textkonsole, über eine grafische Anmeldung (Display Manager) oder über Remote-SH.

Textkonsole oder entfernte ssh verwenden

Sowohl die Anmeldung über die Textkonsole als auch die Fernanmeldung über ssh enden mit einer Login-Shell. Die Variablen werden schrittweise von mehreren Prozessen nacheinander erworben. Jeder Prozess fügt einige weitere Variablen hinzu.

1. Am Ende des Bootvorgangs wird die Mutter aller Prozesse `init` gestartet. Die Umgebung von `init`, einschließlich PATH, ist in seinem Quellcode definiert und kann zur Laufzeit nicht geändert werden.
1. `init` führt die Startskripte aus `/lib/systemd/system` (unter systemd) oder `/etc/rc?.d` aus, basierend auf dem in `/etc/inittab` (unter sysvinit) eingestellten Runlevel. Jeder Dienst oder jedes Skript definiert seine eigenen benötigten Umgebungsvariablen. Unter systemd werden Variablen, die in verschiedenen `environment.d`-Verzeichnissen definiert sind, den systemd-Benutzereinheiten zur Verfügung gestellt; siehe die environment.d(5)-Manualseite für Details.
1. Am Ende des Bootens führt `init` einen `getty`-Prozess auf einer oder mehreren virtuellen Konsolen aus.  `getty` wartet darauf, dass der Benutzer seinen Namen eingibt, setzt dann die Variable `TERM` und führt `login` aus, um nach einem Passwort zu fragen.
1. `login` überprüft `/etc/passwd` und `/etc/shadow` auf die Kontodaten des Benutzers.  Wenn das Passwort akzeptabel ist, setzt `login` `HOME`, `SHELL`, `PATH`, `LOGNAME` und `MAIL` basierend auf dem Inhalt von `/etc/passwd`, überprüft PAM und führt schließlich die Login-Shell des Benutzers aus.
 a. PAM kann `login` anweisen, auch die Variablen in `/etc/environment` zu lesen. Dies ist die Voreinstellung.
1. Die Login-Shell startet und liest ihre shellspezifischen Konfigurationsdateien.
 a. DebianPkg:bash liest zuerst `/etc/profile`, um Werte zu erhalten, die für alle Benutzer definiert sind. Nachdem sie diese Datei gelesen hat, sucht sie nach `~/.bash_profile`, `~/.bash_login` und `~/.profile`, in dieser Reihenfolge, und liest und führt Befehle aus der ersten dieser Dateien, die existiert und lesbar ist, aus.  Siehe DotFiles für weitere Details.
 a. (bitte geben Sie auch andere Shells an)

Für ssh-Anmeldungen ist die Kette ähnlich. Das `init`-System führt den `sshd`-Dienst aus, der auf entfernte Client-Verbindungen wartet.

1. `sshd` hat eine Startumgebung, die durch seine Servicedatei definiert ist.
1. PAM kann zusätzliche Variablen bereitstellen.
1. `/etc/ssh/sshd_config` definiert zusätzliche Umgebungsvariablen, die vom Client akzeptiert werden können.
1. Nach der Authentifizierung führt sshd eine Login-Shell aus, die ihre shellspezifischen Dot-Dateien wie oben angegeben liest.

Nun sind die Umgebungsvariablen bereit, von den Anwendungen verwendet zu werden, die Sie von der Shell aus starten.

Verwendung eines grafischen Anzeigemanagers

Der Anmeldevorgang ist unter einem DisplayManager ganz anders.

1. Am Ende des Bootens wird die Mutter aller Prozesse -- `init` -- gestartet.
1. `init` führt Dienste wie oben beschrieben aus.  Einer dieser Dienste wird Ihr DisplayManager sein.
1. Wenn sich der Benutzer erfolgreich anmeldet, prüft der Display-Manager PAM und startet dann eine Xsession.
 a. PAM kann den DM anweisen, die Variablen aus `/etc/environment` zu lesen.
1. Die Xsession liest `~/.xsessionrc` und möglicherweise andere Dateien, abhängig vom Sitzungstyp.

Ob die Startdateien der Shell (`/etc/profile` und `~/.profile` und so weiter) bei grafischen Anmeldungen eine Wirkung haben, hängt vom DisplayManager ab. Zum Beispiel lädt SDDM sie standardmäßig, während sie von LightDM in der Debian-Konfiguration ignoriert werden. Ein Benutzer kann eine `~/.xsessionrc`-Datei erstellen, die diese Dateien liest.

Desktop-Umgebungen und systemd-Benutzerdienste

Einige Desktop-Umgebungen starten Programme über systemd-Benutzerdienste. Diese Programme erben ihre Umgebung nicht von der X-Sitzung. Um die Umgebung für solche Programme zu konfigurieren, muss man den Daemon `systemd --user` konfigurieren.

Dies kann wie folgt geschehen:

* `mkdir -p ~/.config/systemd/user/service.d`
* Verwenden Sie Ihren bevorzugten Texteditor, um eine Datei in diesem Verzeichnis zu erstellen. Der Dateiname muss mit `.conf` enden, sonst wird er nicht erkannt. Nehmen wir an, Sie verwenden `env.conf` als Dateinamen. Fügen Sie innerhalb der Datei `env.conf` die folgenden Zeilen ein:
. {{{

[Service] Umgebung="MYVAR=irgendein Wert" }}}

* Für eine Liste von Escape-Sequenzen, die in dieser Datei verwendet werden können, siehe systemd.unit(5).
* systemctl --user daemon-reload
* In einigen Desktop-Umgebungen müssen Sie möglicherweise auch einen Start- oder Menüdienst neu starten oder sich ab- und wieder anmelden.

Sie können mehr als eine Umgebungsvariable angeben, und Sie können hier auch umask oder Ressourcenlimits konfigurieren (siehe Standardumask setzen für Details). Sie können mehrere Dateien haben, oder eine Datei mit mehreren Einträgen, wie Sie es für richtig halten.

environment.d(5) bietet eine weitere Möglichkeit, dies zu erreichen, aber sie ist strikt auf Umgebungsvariablen beschränkt (keine umask oder Ressourcenbeschränkungen) und verwendet eine andere Syntax. Es unterstützt auch nicht die Spezifizierer (%h, etc.), die systemd.unit(5) definiert, sondern hat stattdessen eine Pseudo-Shellvariablen-Expansionssyntax.

Kurzanleitung

Für die Eiligen, die das System einfach nur zum Laufen bringen müssen, können Sie folgendes tun:

* Legen Sie alle globalen Umgebungsvariablen, d.h. diejenigen, die alle Benutzer betreffen, in /etc/environment ab.
 * Denken Sie daran, dass diese Datei von PAM gelesen wird, nicht von einer Shell.  Sie können hier keine Shell-Erweiterungen verwenden.  Z.B. `MAIL=$HOME/Maildir/` wird nicht funktionieren!
 * Es gibt keine shell-agnostische und login-unabhängige Lösung für das Problem, wie man die Umgebung für alle Benutzer konfiguriert, abgesehen von den trivialen Fällen, die PAM handhaben kann.
* Legen Sie alle Ihre vorübergehenden Shell-Einstellungen (Aliase, Funktionen, Shell-Optionen) in ~/.bashrc ab.
* Legen Sie alle Ihre Umgebungsvariablen in ~/.profile ab.
* Erstellen oder bearbeiten Sie die Datei ~/.bash_profile und fügen Sie Befehle ein:
{{{
if [ -f ~/.profile ]; then
    . ~/.profile
fi
}}}
* Erstellen oder bearbeiten Sie die Datei ~/.xsessionrc und fügen Sie die gleichen Befehle wie oben ein.
* Wenn Sie eine Desktop-Umgebung verwenden, erstellen Sie eine Datei env.conf, wie im vorherigen Abschnitt gezeigt.

Dies ist ein schneller und schmutziger Ansatz! Nicht für den pedantischen Benutzer.

Hinweise und Ausnahmen

SysV, Systemd und init

Laut GW in [PATH revisited: one PATH to rule the [Debian World"]] ist `/sbin/init` das, was vom Kernel ausgeführt wird, unabhängig davon, welches Init-System installiert ist.

{{{ $ ps -fp 1 UID PID PPID C STIME TTY TIME CMD root 1 0 0 Okt07 ? 00:01:58 /sbin/init

$ ls -l /sbin/init lrwxrwxrwx 1 root root 20 Sep 20 08:15 /sbin/init -> /lib/systemd/systemd* }}}

startx vom Terminal aus starten

Wenn Sie X Window (die grafische Benutzeroberfläche) von einer Textkonsole aus starten, sind Ihre Umgebungsvariablen bereits von Ihrer Login-Shell definiert, wie oben erläutert. Allerdings kann es sein, dass der Window-Manager dieselben Dateien erneut einliest (siehe unten). Dies ist normalerweise kein Problem, aber Sie können unerwartete Ergebnisse erhalten, wie z.B. dass alle Einträge in PATH doppelt aufgeführt sind.

Shell-Kaskadierung

Wenn Sie innerhalb der Login-Shell eine weitere Shell starten (ja, das ist möglich), ist die zweite Shell eine Nicht-Login-Shell. Sie liest keine benannten Startdateien, sondern sucht stattdessen das Nicht-Login-Startskript aus dem Home-Verzeichnis des Benutzers. Bei der Bash heißt es `~/.bashrc`. Um zu vermeiden, dass dieselben Werte an zwei Stellen angegeben werden, schließt das Startskript der Login-Shell `~/.bash_profile` am Ende seiner Ausführung die `~/.bashrc` ein. Zur Implementierung fügen Sie folgendes in Ihr `~/.bash_profile` ein: {{{ if [ -f ~/.bashrc ]; then

  . ~/.bashrc;

fi }}}

Terminal-Fenster in X

Wenn Sie ein Terminal-/Konsolenfenster in einer grafischen Desktop-Umgebung starten, ist es ein Nicht-Login-Terminal und liest nur das Nicht-Login-Startskript des Benutzers. Für Bash ist dies `~/.bashrc`.

Verwendung von su

Der Befehl `su` wird verwendet, um während einer Login-Sitzung ein anderer Benutzer zu werden. Er wird üblicherweise verwendet, um vorübergehend Root-Rechte von einer normalen Sitzung zu erhalten. In Stretch und früheren Versionen setzt der `su`-Befehl Ihren PATH-Umgebungswert auf einen Wert zurück, der in `/etc/login.defs` durch die Variablen ENV_PATH und ENV_SUPATH definiert ist. In Buster und späteren Versionen ändert `su` Ihre PATH-Variable standardmäßig nicht (für Details, siehe `/usr/share/doc/util-linux/NEWS.Debian.gz`). Sie können es anweisen, dies zu tun, indem Sie die Datei `/etc/default/su` erstellen und die Zeile `ALWAYS_SET_PATH yes` darin einfügen.

Bitte beachten Sie, dass der Gnome-Helfer `gksu` aus dem Gnome-Panel standardmäßig `su` intern verwendet (d.h. Sie könnten Ihren PATH "verlieren", wenn Sie ihn nicht in login.defs in stretch konfigurieren).

. Bedeutet das, dass gksu in buster aufgrund des fehlenden /sbin u.a. im PATH schlichtweg versagt?

KategorieSystemadministration


Linux environment variables

Popular environment variables

Linux environment variables are dynamic values that influence the behavior and configuration of running processes and applications, providing essential information such as system paths, user information, and localization settings