Linux / Befehl printenv: Umgebungsvariablenwerte drucken

printenv ist ein GNU Coreutils-Befehl, der die Werte der Variablen in der aktuellen Prozessumgebung ausgibt. Wenn Sie einen Variablennamen angeben, können Sie nur den benötigten Wert überprüfen, und wenn Sie den Namen weglassen, werden alle Umgebungsvariablen ausgegeben.

Im Gegensatz zu env, das die Umgebung ändert, um einen Befehl auszuführen, konzentriert sich printenv auf die Inspektion. Es ist nützlich, um den Unterschied zwischen Shell-Variablen und Umgebungsvariablen zu überprüfen oder zu bestätigen, ob eine Variable in einem Skript übergeben wurde.

Ergänzende Befehle und Anwendungsfälle finden Sie in Liste der häufig verwendeten Befehle in Linux.

Was ist der Befehl printenv?

Ein Programm erhält eine Reihe von Umgebungsvariablen von seinem übergeordneten Prozess. printenv sendet entweder die gesamte Menge oder den Wert eines angegebenen Namens aus der Umgebung, die es erhalten hat, an die Standardausgabe.

Variablen, die nur innerhalb der Shell existieren und nicht exported wurden, sind nicht in der Umgebung enthalten, daher werden sie mit printenv nicht sichtbar sein.

Grundlegende Syntax

printenv [options] [variable...]

Wenn es ohne einen Variablennamen ausgeführt wird, werden alle Umgebungsvariablen im name=value-Format ausgegeben.

printenv
printenv | sort

Die vollständige Umgebung kann Authentifizierungstoken oder Servicezugangsinformationen enthalten. Bevor die Ergebnisse weitergegeben oder in einem Protokoll gespeichert werden, stellen Sie sicher, dass keine sensiblen Elemente enthalten sind.

Überprüfen einer bestimmten Umgebungsvariablen

printenv HOME
printenv PATH
printenv LANG

Wenn Sie einen Variablennamen angeben, wird nur der Wert ausgegeben, und das Präfix name= wird nicht angehängt. Sie können auch mehrere Namen gleichzeitig angeben.

printenv HOME SHELL USER

Nur mit der Ausgabe kann es schwierig sein zu unterscheiden, welche Zeile welcher Variablen entspricht. Wenn es sich also um einen Bericht für Menschen handelt, sollten Sie überlegen, auch den Namen separat anzuzeigen.

Überprüfen, ob eine Variable durch den Exit-Status existiert

GNU printenv gibt 0 zurück, wenn alle angegebenen Variablen gefunden werden, 1, wenn eine nicht gefunden werden kann, und 2, wenn ein Schreibfehler auftritt.

if printenv APP_ENV >/dev/null; then
  printf '%s\n' 'APP_ENV is exported'
else
  printf '%s\n' 'APP_ENV is not exported'
fi

Eine Umgebungsvariable mit einem leeren Wert ist ebenfalls eine "existierende Variable". Um zwischen einem leeren Wert und dem Fehlen einer Variablen zu unterscheiden, müssen Sie sowohl den Exit-Status als auch die Ausgabe zusammen überprüfen.

Fälle, in denen eine Shell-Variable vorhanden ist, aber nicht in printenv erscheint

APP_MODE=development
printf '%s\n' "$APP_MODE"
printenv APP_MODE

Die erste Zuweisung erstellt eine Bash-Shell-Variable, aber sie wird nicht in die Umgebungen der Kindprozesse exportiert. printenv ist ein externes Programm, daher kann es diesen Wert nicht erhalten.

export APP_MODE
printenv APP_MODE

Nach export können printenv und andere danach ausgeführte Kindprozesse den Wert erhalten.

Anzeigen der PATH-Einträge Zeile für Zeile

PATH ist eine Liste von Verzeichnissen, die durch Doppelpunkte getrennt sind, sodass Sie sie auf diese Weise aufteilen können, um sie leichter zu lesen.

printenv PATH | tr ':' '\n'

Leere Einträge können das aktuelle Verzeichnis darstellen, was ein Sicherheitsproblem darstellen kann. Überprüfen Sie auch, ob es Doppelpunkte am Anfang, Ende oder aufeinanderfolgende Doppelpunkte in der Ausgabe gibt.

Verwendung von -0 zur Trennung mit NUL-Zeichen

printenv -0
printenv --null

-0 oder --null gibt NUL-Zeichen am Ende jedes Elements anstelle von Zeilenumbrüchen aus. Da die Werte von Umgebungsvariablen selbst Zeilenumbrüche enthalten können, ist dies nützlich, wenn ein anderes Programm die Ergebnisse eindeutig verarbeiten muss.

printenv -0 | while IFS= read -r -d '' item; do
  printf '%q\n' "$item"
done

Die Verwendung von read -d in diesem Beispiel basiert auf Bash. Einfache Textwerkzeuge unterstützen möglicherweise keine NUL-getrennten Eingaben, daher sollte sichergestellt werden, dass die gesamte Pipeline dieses Format verarbeiten kann.

Unterstützte Optionen

Option Beschreibung
-0, --null Jedes Ausgabeelement mit einem NUL-Zeichen anstelle eines Zeilenumbruchs beenden.
--help Die Verwendung anzeigen und beenden.
--version Die Programmversion anzeigen und beenden.

-0 ist eine Funktion der GNU Coreutils. Die Unterstützung kann auf anderen Unix-ähnlichen Systemen variieren.

Vergleich von printenv, env, echo

Befehl Zu überprüfende Punkte Funktionen
printenv NAME Umgebungsvariablen, die an Kindprozesse übergeben werden Nützlich, um das Vorhandensein einer bestimmten Umgebungsvariablen im Exit-Status zu überprüfen.
env Die gesamte aktuelle Umgebung Die Hauptfunktion besteht darin, die Umgebung zu ändern, um einen anderen Befehl auszuführen.
printf '%s\n' "$NAME" Aktueller Wert der von der Shell expandierten Variablen Sie können auch Shell-Variablen anzeigen, die nicht in die Umgebung exportiert wurden.

Sie können den Wert auch mit echo "$NAME" sehen, aber in Skripten ist printf vorhersehbarer, um Unterschiede in der Implementierung wie Werte, die wie Optionen aussehen, oder die Behandlung von Backslashes zu vermeiden.

Überprüfung vorübergehend gesetzter Umgebungen

Wenn es mit env verwendet wird, können Sie die Werte überprüfen, die an einen bestimmten Befehl übergeben werden.

env APP_ENV=staging printenv APP_ENV
env -u HTTP_PROXY printenv HTTP_PROXY

Der zweite Befehl gibt nichts aus und gibt einen Fehlerstatus zurück, weil die Variable entfernt wurde.

Warum Werte für jeden Prozess unterschiedlich sind

Die Umgebung ist nicht ein einzige systemweite Tabelle, sondern Daten, die jeder Prozess hat. Ein neues Terminal, eine SSH-Sitzung, ein systemd-Dienst, ein Cron-Job und ein Container verwenden unterschiedliche übergeordnete Prozesse und Startkonfigurationen, sodass derselbe Variablenname einen anderen Wert haben oder möglicherweise nicht existieren kann.

Bei der Diagnose von Problemen sollten Sie printenv in derselben Benutzer-, Dienst- und Containerumgebung ausführen, in der das eigentliche Programm läuft. Gehen Sie nicht davon aus, dass Werte, die im Terminal sichtbar sind, automatisch an den Dienst übergeben werden.

Sicherheitsvorkehrungen beim Anzeigen von Umgebungsvariablen

  • Fügen Sie die vollständigen printenv-Ergebnisse nicht in öffentliche Issues oder Chats ein.
  • Überprüfen Sie, ob Tokens und Passwörter in CI-Protokollen maskiert sind.
  • Geben Sie nur die Variablennamen an, die Sie überprüfen müssen, um die minimale Anzahl von Werten zu prüfen.
  • Wenn überprüft wird, ob ein geheimer Wert benötigt wird, drucken Sie den Wert nicht aus; verwenden Sie stattdessen den Exit-Status.
  • Umgebungsvariablen können Debugging-Tools oder untergeordneten Prozessen mit denselben Berechtigungen offengelegt werden, daher sollten sie nicht als geheime Speicher betrachtet werden.

Häufige Probleme

Der Wert erscheint möglicherweise nicht, selbst wenn er gesetzt wurde.

Es ist wahrscheinlich, dass Sie nur eine Shell-Variable erstellt haben, ohne sie mit export zu exportieren. Führen Sie export NAME aus und prüfen Sie dann in einem neuen untergeordneten Prozess.

Es wurde eine leere Zeile ausgegeben, bedeutet das, dass die Variable nicht existiert?

Es kann schwierig sein, allein durch das Betrachten des Bildschirms zu unterscheiden, ob eine Variable auf einen leeren String gesetzt ist oder nicht existiert. Überprüfen Sie den Exit-Status des Befehls.

printenv EMPTY_VALUE
printf 'status=%s\n' "$?"

Die Umgebungsvariable verschwindet nach sudo.

sudo entfernt oder beschränkt Umgebungsvariablen gemäß den Sicherheitspolicies. Anstatt sie immer zu umgehen, um sie zu bewahren, überprüfen Sie die sudoers-Policy und nur die Variablen, die für den Zielbefehl notwendig sind.

Häufig gestellte Fragen

Zeigt printenv alle Variablen der aktuellen Shell an?

Nein. Es zeigt nur die Variablen, die in die Umgebung exportiert wurden. Bashs lokale Variablen, Arrays und einige spezielle Variablen müssen mit eingebauten Shell-Befehlen wie declare oder set überprüft werden.

Kann ich den Namen und den Wert einer bestimmten Variablen zusammen ausdrucken?

printenv NAME druckt nur den Wert. Wenn Sie auch den Namen benötigen, können Sie es wie printf 'NAME=%s\n' "$(printenv NAME)" strukturieren, aber seien Sie vorsichtig bei Aufgaben, bei denen Sie den ursprünglichen Wert genau beibehalten müssen, da die Befehlsersetzung das nachgestellte Newline-Zeichen entfernt.

Können Sie Umgebungsvariablen mit printenv ändern?

Nein. printenv ist ein Abfragebefehl. Verwenden Sie in der aktuellen Shell Zuweisungen und export, und um dies nur für einen Befehl anzuwenden, verwenden Sie env NAME=VALUE command.

Weitere Angaben zu Syntax, Implementierung und Verfügbarkeit finden Sie unter GNU Coreutils Handbuch: printenv Aufruf und GNU Coreutils Handbuch: env Aufruf.