Warum unterscheiden sich die folgenden beiden Möglichkeiten zum Anzeigen von Umgebungsvariablen der aktuellen Shell?

Warum unterscheiden sich die folgenden beiden Möglichkeiten zum Anzeigen von Umgebungsvariablen der aktuellen Shell?

Ich habe die PID meiner Bash-Shell gefunden

$ echo $$
7791

Dann überprüfe ich die Umgebungsvariablen auf zwei verschiedene Arten:

$ cat /proc/7791/environ | tr '\0' '\n'

aushttps://stackoverflow.com/a/532284/156458, Und

$ env

Ihre Ausgaben sind jedoch nicht identisch. Sie zeigen beispielsweise unterschiedliche Werte von an PATH. Warum unterscheiden sie sich? Danke.

Antwort1

Sie sollten die Kommentare unter dieser irreführenden Antwort lesen.

/proc/$PID/environwird von der Shell nicht live verwendet. Es stellt lediglich die ursprüngliche Umgebung des Prozesses beim Start dar.

Alles, was in der Shell getan wird, einschließlich ihrer Init-Skripte, kann diese Werte innerhalb der Shell ändern, ohne dass sich der procangezeigte Eintrag ändert.

Antwort2

/proc/7791/environzeigt die ursprüngliche Umgebung der Shell, wie sie vom Prozess beim Start mit dem Systemaufruf execve erhalten wurde:

 int execve(const char *filename, char *const argv[], char *const envp[]);

Wenn die Shell läuft, kann sie ihren Satz exportierter Variablen ändern, beispielsweise durch Auswerten . Dieser neue Satz wird dann beim Starten des Programms .bashrcim Vektor übergeben .envpenv

Antwort3

Egal welches Problem Sie lösen möchten, Sie können es mit

/proc/self

löst das Problem. Anstatt die ursprüngliche Umgebung der Shell abzurufen,

cat /proc/self/environ

zeigt die Umgebung des catBefehls an, die der aktuellen Umgebung der Shell entsprechen sollte, in der er ausgeführt wird.

verwandte Informationen