Linux/Umgebung/Variable: Unterschied zwischen den Versionen

Aus Foxwiki
K Textersetzung - „== Syntax ==“ durch „== Aufruf ==“
 
(31 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 1: Zeile 1:
= TMP =
'''Linux/Umgebungsvariable''' - Benannte Zeichenketten, die für alle Anwendungen verfügbar sind
== General ==
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.


That said, there are several standard variables in Linux environments:
== Beschreibung ==
* PATH = Colon separated list of directories to search for commands.
=== Variablen ===
* HOME = Current user's home directory.
Variablen werden verwendet, um das Verhalten jeder Anwendung an die Umgebung, in der sie läuft, anzupassen
* LOGNAME = Current user's name.
* SHELL = The user's preferred shell.
* EDITOR = The user's preferred text editor.
* MAIL = The user's electronic mail inbox location.


To see your currently defined variables, open up your terminal and type the `env` command.
; Anpassungen
* Pfade für Dateien
* Sprachoptionen
* ...


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.
Im Handbuch jeder Anwendung sollte stehen, welche Variablen von dieser Anwendung verwendet werden


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.
=== Standardvariablen ===
Es gibt jedoch einige Standardvariablen in Linux-Umgebungen
{| class="wikitable sortable options"
|-
! Option !! Beschreibung
|-
| 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
|}


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:
=== Anzeigen ===
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.
Um Ihre aktuell definierten Variablen zu sehen, öffnen Sie Ihr Terminal und geben Sie den Befehl [[env]] ein
  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.
  $ env
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.


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 ...
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


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.
In Bash wäre dies export MYVAL="Hello world"
* In diesem Fall bleibt die Variable bis zum Ende der Terminalsitzung definiert


== Using text console or remote ssh ==
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
Text console logins and remote ssh logins both end up with a ''login shell''.  Variables are acquired in stages, by multiple processes in sequence.  Each process adds some more variables.
  export PATH=$PATH:~/bin
  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.
Dieses Beispiel zeigt, wie man das Verzeichnis bin im Heimatverzeichnis des Benutzers an die Umgebungsvariable PATH anhängt
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. 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. `login` checks `/etc/passwd` and `/etc/shadow` for the user's account details.  If 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.
  a. PAM may instruct `login` to read the variables in `/etc/environment` also. This is the default.
1. The login shell starts and reads its shell-specific configuration files.
  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 readable.  See DotFiles for full details.
  a. (please fill in other shells as well)


For ssh logins, the chain is similar. The `init` system runs the `sshd` service, which listens for remote client connections.
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, sodass sie automatisch verfügbar sind
1. `sshd` has a starting environment defined by its service file.
* Leider ist dies nicht immer so einfach, wie es klingt
1. PAM may supply additional variables.
* Und warum? Dafür gibt es mehrere Gründe
1. `/etc/ssh/sshd_config` defines additional environment variables that may be accepted from the client.
# Die meisten Programme lesen keine Konfigurationsdatei, um ihre Umgebung einzustellen; stattdessen erben sie diese von einem übergeordneten Prozess
1. After authentication, sshd runs a login shell, which reads its shell-specific dot files as indicated above.
#* Sie müssen die Einstellungen des Elternprozesses so konfigurieren, dass er sie an alle seine Kinder weitergibt
# 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
# Einige Desktop-Umgebungen starten Programme über einen Hilfsdienst, sodass der Fenstermanager möglicherweise nicht das gesuchte übergeordnete Programm ist


Now the environment variables are ready to be used by the applications you start from the shell.
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


== Using graphical display manager ==
Es gibt mehrere Möglichkeiten, auf Ihren Linux-Rechner zuzugreifen: über eine Textkonsole, über eine grafische Anmeldung (Display Manager) oder über Remote-SH
The login process is quite different under a DisplayManager.
1. At the end of booting, the mother of all processes -- `init` -- is started.
1. `init` runs services as described above.  One of these services will be your display manager.
1. When the user successfully logs in, the display manager checks PAM, and then starts an [[Xsession]].
  a. PAM may instruct the DM to read the variables from `/etc/environment`.
1. The Xsession reads `~/.xsessionrc` and possibly other files depending on the session type.


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.
== Aufruf ==
<syntaxhighlight lang="bash" highlight="1" line>


== Desktop Environments and systemd user services ==
</syntaxhighlight>
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.


This may be done as follows:
== Anwendung ==
* `mkdir -p ~/.config/systemd/user/service.d`
=== Textkonsole ===
* 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:
; Textkonsole oder entfernte ssh verwenden
. {{{
Sowohl die Anmeldung über die Textkonsole als auch die Fernanmeldung über ssh enden mit einer ''Login-Shell''
[Service]
* Die Variablen werden schrittweise von mehreren Prozessen nacheinander erworben
Environment="MYVAR=some value"
* Jeder Prozess fügt einige weitere Variablen hinzu
}}}
# Am Ende des Bootvorgangs wird die Mutter aller Prozesse init gestartet
* For a list of escape sequences that may be used in this file, see [[DebianMan:systemd.unit#SPECIFIERS|systemd.unit(5)]].
* Die Umgebung von init, einschließlich PATH, ist in seinem Quellcode definiert und kann zur Laufzeit nicht geändert werden
  * `systemctl --user daemon-reload`
# 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
  * In some Desktop Environments, you may also need to restart a launcher or menu service, or perhaps log out and back in.
* 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
# 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
# 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)


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.
Für ssh-Anmeldungen ist die Kette ähnlich
* Das init-System führt den sshd-Dienst aus, der auf entfernte Client-Verbindungen wartet
# sshd hat eine Startumgebung, die durch seine Servicedatei definiert ist
# PAM kann zusätzliche Variablen bereitstellen
# /etc/ssh/sshd_config definiert zusätzliche Umgebungsvariablen, die vom Client akzeptiert werden können
# Nach der Authentifizierung führt sshd eine Login-Shell aus, die ihre shellspezifischen Dot-Dateien wie oben angegeben liest


[[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.
Nun sind die Umgebungsvariablen bereit, von den Anwendungen verwendet zu werden, die Sie von der Shell aus starten


== Quick guide ==
=== Grafischen Anmeldung ===
For the hasty who just need to get the system running, here is what you can do:
; Verwendung eines grafischen Anzeigemanagers
Der Anmeldevorgang ist unter einem DisplayManager ganz anders
# Am Ende des Bootens wird die Mutter aller Prozesse -- init -- gestartet
# init führt Dienste wie oben beschrieben aus
* Einer dieser Dienste wird Ihr DisplayManager sein
# Wenn sich der Benutzer erfolgreich anmeldet, prüft der Display-Manager PAM und startet dann eine [[Xsession]]
#* PAM kann den DM anweisen, die Variablen aus /etc/environment zu lesen
# Die Xsession liest ~/.xsessionrc und möglicherweise andere Dateien, abhängig vom Sitzungstyp


  * Put all global environment variables, i.e. ones affecting all users, into '''/etc/environment'''
Ob die Startdateien der Shell (/etc/profile und ~/.profile und so weiter) bei grafischen Anmeldungen eine Wirkung haben, hängt vom DisplayManager ab
  * Remember, this file is read by PAM, ''not'' by a shell. You cannot use shell expansions here.  E.g. `MAIL=$HOME/Maildir/` will not work!
* Zum Beispiel lädt [[SDDM]] sie standardmäßig, während sie von [[LightDM]] in der Debian-Konfiguration ignoriert werden
  * 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.
* Ein Benutzer kann eine ~/.xsessionrc-Datei erstellen, die diese Dateien liest
* Put all your transient shell settings (aliases, functions, shell options) in '''~/.bashrc'''
 
* Put all your environment variables in '''~/.profile'''
=== Desktop-Umgebungen und systemd-Benutzerdienste ===
* Create or edit file '''~/.bash_profile''' and include commands:
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 [[DebianMan:systemd.unit#SPECIFIERS|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 [[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)]] 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
  if [ -f ~/.profile ]; then
    . ~/.profile
. ~/.profile
  fi
  fi
  }}}
  }}}
* Create or edit file '''~/.xsessionrc''' and include the same commands as above.
* If you use a Desktop Environment, create an `env.conf` file as shown in the previous section.


This is a quick and dirty approach!  Not for the pedantic user.
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


== Notes and exceptions ==
Dies ist ein schneller und schmutziger Ansatz! Nicht für den pedantischen Benutzer


=== SysV, Systemd and init ===
=== Hinweise und Ausnahmen ===


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.
==== SysV, Systemd und init ====
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
lrwxrwxrwx 1 root root 20 Sep 20 08:15 /sbin/init -> /lib/systemd/systemd*
lrwxrwxrwx 1 root root 20 Sep 20 08:15 /sbin/init -> /lib/systemd/systemd*
}}}
}}}


=== 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
if [ -f ~/.bashrc ]; then
* Bei der Bash heißt es ~/.bashrc
  . ~/.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
fi
* Zur Implementierung fügen Sie folgendes in Ihr ~/.bash_profile ein
}}}
{{{
if [ -f ~/.bashrc ]; then
. ~/.bashrc;
fi
}}}


=== 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.&nbsp;h.&nbsp;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.&nbsp;a.&nbsp;im PATH schlichtweg versagt?''


== Konfiguration ==
=== Dateien ===
<noinclude>
== Anhang ==
=== Siehe auch ===
{{Special:PrefixIndex/{{BASEPAGENAME}}}}
----
----
CategorySystemAdministration
* [[env]]
 
==== Dokumentation ====
===== Man-Page =====
* DebianMan:7/environ|environ(7)


= Linux environment variables =
===== Info-Pages =====
[[File:2024-08-06_11-00-00_UTC.jpg|mini|400px|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
==== Links ====
===== Weblinks =====


[[Kategorie:Systemadministration]]
[[Kategorie:Linux/Shell]]
[[Kategorie:Bash/Variablen]]


[[Kategorie:Linux]]
</noinclude>

Aktuelle Version vom 12. November 2024, 18:45 Uhr

Linux/Umgebungsvariable - Benannte Zeichenketten, die für alle Anwendungen verfügbar sind

Beschreibung

Variablen

Variablen werden verwendet, um das Verhalten jeder Anwendung an die Umgebung, in der sie läuft, anzupassen

Anpassungen
  • Pfade für Dateien
  • Sprachoptionen
  • ...

Im Handbuch jeder Anwendung sollte stehen, welche Variablen von dieser Anwendung verwendet werden

Standardvariablen

Es gibt jedoch einige Standardvariablen in Linux-Umgebungen

Option Beschreibung
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

Anzeigen

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

$ env

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

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, sodass 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
  2. 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
  3. Einige Desktop-Umgebungen starten Programme über einen Hilfsdienst, sodass 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

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

Aufruf

Anwendung

Textkonsole

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
  2. PAM kann zusätzliche Variablen bereitstellen
  3. /etc/ssh/sshd_config definiert zusätzliche Umgebungsvariablen, die vom Client akzeptiert werden können
  4. 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

Grafischen Anmeldung

Verwendung eines grafischen Anzeigemanagers

Der Anmeldevorgang ist unter einem DisplayManager ganz anders

  1. Am Ende des Bootens wird die Mutter aller Prozesse -- init -- gestartet
  2. 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
    • PAM kann den DM anweisen, die Variablen aus /etc/environment zu lesen
  2. 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?

Konfiguration

Dateien

Anhang

Siehe auch


Dokumentation

Man-Page
  • DebianMan:7/environ|environ(7)
Info-Pages

Links

Weblinks