Wenn ich die Umgebung meines Systems überprüfe, werden viele Umgebungsvariablen angezeigt. Wie kann ich nur nach einer bestimmten Variablen suchen?
Ein Buch, das ich lese, sagt:
Manchmal wächst die Anzahl der Variablen in Ihrer Umgebung so stark an, dass Sie nicht alle angezeigten Werte sehen möchten, wenn Sie nur an einer interessiert sind. In diesem Fall können Sie den
echo
Befehl verwenden, um den aktuellen Wert einer Umgebungsvariablen anzuzeigen.
Wie mache ich das in einem Linux-Terminal?
command-line
environment-variables
iLearnSlow
quelle
quelle
echo
ist eine schlechte Wahl eines Befehls, da er den Inhalt der Variablen transformieren könnte. Der Inhalt des Shell-Parameters wird mit demselben Namen ausgegeben. Das ist nicht unbedingt das gleiche , wenn die Bourne - Shell oder für env mit vars wie1
,*
zum Beispiel. Und Sie können diesen Ansatz nicht für Umgebungsvariablen verwenden, deren Name nicht als Shell-Variablenname gültig ist.printenv VAR
zeigt sie alle an (zumindest für die GNU-Implementierung).Durch Ausführen von:
printenv
Sie sehen alle Umgebungsvariablen. Weitere Informationen finden Sie unter:
https://www.digitalocean.com/community/tutorials/how-to-read-and-set-environmental-and-shell-variables-on-a-linux-vps
quelle
printenv
variablename
wird nur die angegebene Variable angezeigt. ZBprintenv HOME
wird ungefähr das Gleiche tun wieecho "$HOME"
.Es ist wichtig zu verstehen, dass jeder Prozess seine eigenen Umgebungsvariablen hat.
Wenn ein Prozess ruft den
fork()
Systemaufruf, einen zweiten Prozess (das Kind ) identisch mit der ersten ( der Mutter ) erstellt (diese Kopie die Umgebung umfasst, die knapp über dem Stapel befindet (oder knapp darunter, je nachdem , wie Sie von Stapeln denken:-)
- aber in unix / linux wächst der stack runter von hohen Adressen ab.Normalerweise ruft der untergeordnete Prozess dann den
execve()
Systemaufruf auf, der alles in seinem (virtuellen) Speicher verwirft und rekonstruiert aus den Code- und Datenabschnitten in der angegebenen Binärdatei .Bei der Rekonstruktion des Stapels werden jedoch die
execve()
an den Stapel übergebenen Umgebungs- und Argumentzeichenfolgen zuerst (in dieser Reihenfolge) kopiert , bevor diemain()
Funktion aufgerufen wird (ein Großteil der Arbeit wird imcrt0
Bootstrap-Code nach derexecve()
Rückkehr (zum Eintrag) erledigt Punkt in der Binär)) angegeben.Es gibt Wrapper für den
execve()
Systemaufruf in der C-Bibliothek, die die aktuelle Umgebung (dh eine Kopie der übergeordneten Umgebung) übergeben, anstatt dass der Aufrufer sie bereitstellt (so dass das Kind in der Tat die übergeordnete Umgebung erbt ) - sieheenviron(7)
.Versuchen Sie, den Befehl (als root) auszuführen
ps axeww | less
. Dies zeigt Ihnen die Umgebung für alle Prozesse! Ein interessanter Prozess ist Prozess-ID 1 (dh derinit
Prozess - der erste Prozess, der vom Kernel beim Booten erstellt wird).Wenn Sie die Umgebung nach einem bestimmten Prozess durchsuchen möchten (und wissen, dass es sich um eine Prozess-ID handelt), führen Sie den Befehl aus
cat /proc/<PID>/environ
(ersetzen)<PID>
durch die Prozess-ID).Beachten Sie, dass ein Prozess, der über genügend Berechtigungen verfügt, seinen eigenen Stapel neu schreiben kann, wodurch es schwierig wird, die Umgebung zu kennen. In der Ausgabe von ps werden einige Dämonprozesse wie diese angezeigt.
Aber am Ende läuft diese ganze Waffel auf das hinaus, was @chaos oben gesagt hat. Wenn Sie den aktuellen Wert einer bestimmten Umgebungsvariablen in Ihrem Shell-Prozess anzeigen möchten, verwenden Sie einfach den Befehl
echo "$<NAME>"
( builtin) (durch<NAME>
den Namen des Befehls ersetzen ) Umgebungsvariable, an der Sie interessiert sind) ... beachten Sie nur, dass dieselbe Variable in einem anderen Prozess möglicherweise einen anderen Wert hat oder überhaupt nicht existiert.quelle
e
Optionps
und die/proc/…/environ
spezielle Datei möglicherweise nicht auf allen Systemen vorhanden sind. (2) AFAIK, jeder Unix-Prozess hat das Recht, seinen Stack neu zu schreiben und seine Umgebungsvariablen zu ändern. (3) Weitere Informationen finden Sie unter Wem gehören Umgebungsvariablen? (auf Super User ).ps
... aber jetzt , dass Sie diesen Punkt hervorgehoben habe, kann ich erinnere mich nicht , warum ich dachte daß.Sie können bekommen, wonach Sie suchen mit
export
:Zeigt den Inhalt der
$HOME
Variablen an.quelle
wenn Sie viele Variablen einstellen müssen:
nachdem sie gesetzt haben:
als anzeigen was eingestellt wurde:
Auf diese Weise werden Sie bald mit mehreren in cnf-Dateien vordefinierten Sätzen von Shell-Vars arbeiten, die Sie in Kombination mit tmux zum Meister des Konfigurationsmanagements in Shell-Umgebungen machen:
quelle