Linux / Befehl env: Variablen anzeigen und Befehle in einer benutzerdefinierten Umgebung ausführen
env ist ein GNU Coreutils-Befehl, der verwendet wird, um Umgebungsvariablen zu überprüfen oder einen Befehl auszuführen, während einige Umgebungsvariablen hinzugefügt, geändert oder entfernt werden. Es ist besonders nützlich, wenn man einer bestimmten Anwendung eine andere Umgebung übergeben möchte, ohne die aktuelle Shell direkt zu ändern.
Wenn er ohne Argumente ausgeführt wird, zeigt er die derzeit übergebenen Umgebungsvariablen an, aber wenn man sie nur ansehen möchte, macht printenv die Absicht deutlicher. Der Hauptzweck von env ist es, "einen Befehl in einer geänderten Umgebung auszuführen."
Ergänzende Befehle und Anwendungsfälle finden Sie in Liste der häufig verwendeten Befehle in Linux.
Was ist der env-Befehl?
Ein Prozess erbt eine Reihe von Umgebungsvariablen von seinem übergeordneten Prozess. env erstellt basierend auf diesem Satz eine neue Umgebung, indem Variablen hinzugefügt oder entfernt werden, und führt dann den angegebenen Befehl aus. Die Änderungen können an den ausgeführten Kindprozess und dessen Kinder weitergegeben werden, aber die ursprüngliche Umgebung der Shell bleibt unverändert.
Grundlegende Syntax
env [options] [name=value]... [command [arguments]...]
Wenn kein Befehl angegeben ist, wird die resultierende Umgebung ausgegeben.
env env | sort
Da Umgebungsvariablen Geheimnisse enthalten können, sollte die vollständige Ausgabe nicht direkt in Beiträgen, Supportanfragen oder öffentlichen Logs veröffentlicht werden.
Umgebungsvariablen für einen einzelnen Befehl festlegen
env APP_ENV=production ./start.sh env LANG=C sort names.txt
APP_ENV und LANG gelten nur für die Umgebung des auszuführenden Befehls. Nachdem der Befehl beendet ist, werden dieselben Variablen in der aktuellen Shell nicht neu erstellt oder geändert.
printenv APP_ENV
Sie können mehrere Variablen in der Reihenfolge von links nach rechts angeben.
env HOST=127.0.0.1 PORT=8080 DEBUG=1 ./server
Vergleich zwischen Zuweisungsanweisungen in der aktuellen Shell und env
In POSIX-kompatiblen Shells können Sie die Umgebung für einen Befehl festlegen, indem Sie ihn direkt mit name=value voranstellen.
LANG=C sort names.txt env LANG=C sort names.txt
In einfachen Fällen sind die Ergebnisse der beiden Formen ähnlich. env ist nützlich, wenn Sie zusätzliche Funktionen benötigen, wie das Bereinigen der Umgebung, das Entfernen von Variablen, das Ändern des Arbeitsverzeichnisses oder das Suchen nach dem Skriptinterpreter.
Ausführen mit einer bereinigten Umgebung unter Verwendung von -i
env -i /usr/bin/printenv
-i oder --ignore-environment ignoriert die bestehende Umgebung und startet von einer leeren. Es ist nützlich für Reproduzierbarkeitstests oder zum Finden versteckter Umgebungsabhängigkeiten, kann aber auch PATH, HOME, Locale- und authentifizierungsbezogene Variablen entfernen.
Sie können nur die notwendigen Variablen explizit wieder hinzufügen, um auszuführen.
env -i PATH=/usr/bin:/bin HOME="$HOME" LANG=C /usr/bin/env
Wenn PATH fehlt, kann die Befehls-Suche fehlschlagen, verwenden Sie also absolute Pfade oder geben Sie die erforderlichen Pfade zusammen an.
Nur bestimmte Variablen entfernen -u
env -u HTTP_PROXY curl https://example.com env --unset=DEBUG ./start.sh
-u name oder --unset=name entfernt die angegebene Variable aus der resultierenden Umgebung. Es kann verwendet werden, um die Auswirkung von Proxy-, Debug- oder Testvariablen auf das Programmverhalten zu überprüfen.
Das Setzen einer Variable auf einen leeren String unterscheidet sich davon, sie zu entfernen.
env DEBUG= ./start.sh env -u DEBUG ./start.sh
Je nach Programm kann „Variable existiert, aber der Wert ist leer“ und „Variable existiert nicht“ unterschiedlich behandelt werden.
Ausführen in einem anderen Verzeichnis -C
env -C /srv/app ./start.sh env --chdir=/srv/app APP_ENV=production ./start.sh
Das GNU env -C oder --chdir wechselt in das angegebene Verzeichnis und führt dann den Befehl aus. Das Arbeitsverzeichnis der aktuellen Shell ändert sich nicht. Da diese Option eine GNU-Erweiterung ist, sollte in Skripten, die Portabilität erfordern, die Unterstützung geprüft werden.
Häufig verwendete Optionen
| Option | Beschreibung |
|---|---|
-i, --ignore-environment |
Mit einer sauberen Umgebung starten und die bestehende Umgebung ignorieren. |
-u name, --unset=name |
Entfernt die angegebene Variable aus der Umgebung. |
-C directory, --chdir=directory |
Wechselt in das angegebene Verzeichnis, bevor der Befehl ausgeführt wird. |
-S string, --split-string=string |
Teilt die Zeichenkette in mehrere Argumente auf. Wird hauptsächlich verwendet, um mehrere Argumente in einem Shebang zu übergeben. |
-0, --null |
Beim Ausgeben der Umgebung werden Einträge durch ein NUL-Zeichen anstelle eines Zeilenumbruchs getrennt. |
Unterstützte Optionen können je nach Coreutils-Version variieren. Bitte prüfen Sie sowohl die env --help Ihrer Distribution als auch das offizielle Handbuch.
Verwendung von /usr/bin/env in der ersten Zeile eines Skripts
In einem Shebang eines Skripts kann der Interpreter über PATH gefunden werden.
#!/usr/bin/env python3
Dies ist in Entwicklungsumgebungen praktisch, in denen der Interpreter auf unterschiedlichen Systemen in unterschiedlichen Pfaden installiert sein kann. Da jedoch das erste Programm im aktuellen PATH ausgeführt wird, kann für Systemdienste, bei denen Sicherheit und Reproduzierbarkeit wichtig sind, ein verifizierter absoluter Pfad angemessener sein.
Mehrere Interpreterargumente übergeben
In Umgebungen, in denen GNU Coreutils -S unterstützt, kann die Shebang-Zeichenkette in mehrere Argumente aufgeteilt werden.
#!/usr/bin/env -S python3 -I
-S wird von env nicht auf allen Betriebssystemen unterstützt. Überprüfen Sie das Ziel-Distributionssystem, und falls hohe Portabilität erforderlich ist, ziehen Sie in Betracht, Interpreter-Argumente direkt im Skript zu behandeln.
Unterschiede zwischen Shell-Variablen und Umgebungsvariablen
Nur weil Sie eine Variable in der Shell erstellen, bedeutet das nicht, dass sie automatisch an untergeordnete Prozesse weitergegeben wird.
LOCAL_ONLY=value printenv LOCAL_ONLY export LOCAL_ONLY printenv LOCAL_ONLY
Nur Variablen, die exported sind, werden in die Umgebung des neu ausgeführten Programms übernommen. env arbeitet auf Basis der ihm übergebenen Umgebung, nicht auf Basis aller aktuellen Shell-Variablen.
Vergleich zwischen env und printenv
| Kategorie | env |
printenv |
|---|---|---|
| Hauptzweck | Führen Sie einen Befehl in der modifizierten Umgebung aus | Überprüfen Sie den Wert einer Umgebungsvariablen |
| Drucken Sie die gesamte Umgebung | Möglich, wenn der Befehl weggelassen wird | Möglich, wenn der Variablenname weggelassen wird |
| Überprüfen Sie eine bestimmte Variable | Da es kein spezielles Format gibt, wird ein Filter benötigt. | Es wird direkt wie printenv HOME abgefragt. |
| Variablen hinzufügen oder entfernen | Unterstützt. | Nicht unterstützt. |
| Befehl ausführen | Unterstützt. | Nicht unterstützt. |
Sicherheits- und Betriebsmaßnahmen
- Protokollieren Sie nicht die gesamte Umgebung einschließlich Tokens, Passwörter und Pfade zu privaten Schlüsseln.
- Sie sollten die Möglichkeit in Betracht ziehen, dass Geheimnisse in der Shell-Historie oder Prozessinformationen offengelegt werden, wenn Sie geheime Werte direkt in
env NAME=VALUE commandschreiben. - Die Verwendung von
env -ikann zu unterschiedlichem Verhalten führen, da Zertifikatspfade, Gebietsschema- und Proxyvariablen fehlen können. - Der
/usr/bin/envim Shebang wird vonPATHbeeinflusst, daher stellen Sie sicher, dass Sie dem ausgeführten Programm und der Umgebung vertrauen können. - Für Service-Umgebungen verwenden Sie wann immer möglich die expliziten Umgebungs-Einstellungsfunktionen des Service-Managers.
Häufig gestellte Fragen
Bleiben Variablen, die mit env gesetzt wurden, im aktuellen Terminal bestehen?
Nein. env NAME=VALUE command ändert die Umgebung nur für den ausgeführten Befehl und modifiziert nicht die Variablen der übergeordneten Shell.
Was ist der Unterschied zwischen env und export?
export markiert die aktuelle Shell-Variable, damit sie an später ausgeführte Kindprozesse weitergegeben wird. env eignet sich zum Einrichten einer Umgebung für die Ausführung eines einzelnen Befehls.
Der Befehl kann in env -i nicht gefunden werden.
Dies kann daran liegen, dass das vorhandene PATH ebenfalls entfernt wurde. Verwenden Sie den absoluten Pfad der ausführbaren Datei oder legen Sie ausdrücklich das erforderliche PATH fest.
Weitere Angaben zu Syntax, Implementierung und Verfügbarkeit finden Sie unter GNU Coreutils Handbuch: env Aufruf und POSIX-Umgebungsvariablendefinitionen.




