it-swarm.com.de

Wie wird der aktuelle Wert einer Umgebungsvariablen angezeigt?

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, dass Sie nicht alle angezeigten Werte sehen möchten, wenn Sie nur an einer interessiert sind. In diesem Fall können Sie mit dem Befehl echo den aktuellen Wert einer Umgebungsvariablen anzeigen.

Wie mache ich das in einem Linux-Terminal?

24
iLearnSlow

Gerade:

echo "$VARIABLENAME"

Zum Beispiel für die Umgebungsvariable $HOME, verwenden:

echo "$HOME"

Was dann etwas Ähnliches druckt wie:

/home/username

Bearbeiten : Laut Kommentar von Stéphane Chazelas ist es möglicherweise besser, wenn Sie printenv anstelle von verwenden echo:

printenv HOME
26
chaos

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

9
Svetlin Tonchev

Es ist wichtig zu verstehen, dass jeder Prozess seine eigenen Umgebungsvariablen hat.

Wenn ein Prozess den Systemaufruf fork() aufruft, wird ein zweiter Prozess (das Kind) erstellt, der mit dem ersten ( das Elternteil) identisch ist (this copy enthält die Umgebung, die sich direkt über dem Stapel befindet (oder direkt darunter, je nachdem, wie Sie über Stapel denken :-) - aber unter Unix/Linux wächst der Stapel down von hohen Adressen).

Normalerweise ruft der untergeordnete Prozess dann den Systemaufruf execve() auf, der alles in seinem (virtuellen) Speicher wegwirft und rekonstruiert Aus den Code- und Datenabschnitten in angegebene Binärdatei.

Wenn es jedoch rekonstruiert den Stapel, kopiert es die an execve() übergebenen Umgebungs- und Argumentzeichenfolgen zuerst (in dieser Reihenfolge) auf den Stapel, bevor es die Funktion main() function (ein Großteil der Arbeit wird im crt0 bootstrap Code nach der Rückkehr von execve() (zum Einstiegspunkt) erledigt in der Binärdatei angegeben)).

In der C-Bibliothek gibt es Wrapper für den Systemaufruf execve(), die die aktuelle Umgebung (dh eine Kopie der übergeordneten Umgebung) übergeben, anstatt dass der Aufrufer sie bereitstellt (das Kind wird also tatsächlich inherit die Umgebung der Eltern) - siehe environ(7).

Versuchen Sie, den Befehl ps axeww | less (Als root) auszuführen. Dies zeigt Ihnen die Umgebung für alle Prozesse! Interessant ist die Prozess-ID 1 (d. H. Der Prozess init - der erste Prozess, der vom Kernel beim Booten erstellt wird).

Wenn Sie die Umgebung für einen bestimmten Prozess untersuchen möchten (und wissen, dass es sich um eine Prozess-ID handelt), führen Sie den Befehl cat /proc/<PID>/environ Aus (ersetzen Sie <PID> Durch die Prozess-ID).

Beachten Sie, dass ein Prozess, der über genügend Berechtigungen verfügt, seinen eigenen Stapel neu schreiben kann, was es schwierig machen kann, seine Umgebung zu kennen. In der ps-Ausgabe werden einige Daemon-Prozesse wie dieser angezeigt.

Aber am Ende läuft all diese 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 (eingebauten) Befehl echo "$<NAME>" ( Ersetzen Sie <NAME> durch den Namen der Umgebungsvariablen, an der Sie interessiert sind. Beachten Sie jedoch, dass dieselbe Variable in einem anderen Prozess möglicherweise einen anderen Wert hat oder überhaupt nicht vorhanden ist.

5
Murray Jensen

wenn Sie viele Vars einstellen müssen:

  ( set -o posix ; set ) | sort >~/vars.before

nachdem sie eingestellt wurden:

  ( set -o posix ; set ) | sort >~/vars.after

als anzeigen, was eingestellt wurde:

  comm -3 ~/vars.before ~/vars.after | Perl -ne 's#\s+##g;print "\n $_ "'

Auf diese Weise werden Sie bald mit mehreren in cnf-Dateien vordefinierten Sätzen von Shell-Variablen arbeiten. In Kombination mit tmux werden Sie zum Meister des Konfigurationsmanagements in Shell-Umgebungen:

  # ---------------------------------------------------------
  # cat cnf/qto.dev.Host-name.cnf
  # [MainSection]
  # postgres_db_name     = dev_qto
  # postgres_db_Host     = Host-name
  #
  # call by: doParseCnfEnvVars cnf/qto.dev.Host-name.cnf
  # ---------------------------------------------------------
  doParseCnfEnvVars(){

     cnf_file=$1;shift 1;
     test -z "$cnf_file" && echo " you should set the cnf_file !!!"

     INI_SECTION=MainSection

     ( set -o posix ; set ) | sort >~/vars.before

     eval `sed -e 's/[[:space:]]*\=[[:space:]]*/=/g' \
        -e 's/#.*$//' \
        -e 's/[[:space:]]*$//' \
        -e 's/^[[:space:]]*//' \
        -e "s/^\(.*\)=\([^\"']*\)$/export \1=\"\2\"/" \
        < $cnf_file \
        | sed -n -e "/^\[$INI_SECTION\]/,/^\s*\[/{/^[^#].*\=.*/p;}"`

     # and post-register for Nice logging
     ( set -o posix ; set ) | sort >~/vars.after

     echo "INFO added the following vars from section: [$INI_SECTION]"
     comm -3 ~/vars.before ~/vars.after | Perl -ne 's#\s+##g;print "\n $_ "'
  }
1
Yordan Georgiev

Mit export können Sie das bekommen, wonach Sie suchen:

export | grep HOME

Zeigt den Inhalt des $HOME Variable.

1
Darth Egregious