Wie liste ich alle Variablennamen und ihre aktuellen Werte auf?

348

Wie liste ich alle Variablennamen und ihre aktuellen Werte auf?

Und zwar nicht nur $HOME, $PWDusw. , aber andere haben Sie definiert.

Strapakowsky
quelle
Sie haben eine falsche Antwort akzeptiert. "printenv" gibt nur die Umgebungsvariablen an. Wenn Sie wirklich alle Variablen in Ihrer Shell deklarieren möchten, verwenden Sie "declare -p" oder "typeset -p".
Florin Andrei

Antworten:

479

Für Bash: (die Standard-Shell in Ubuntu)

Geben Sie den folgenden Befehl in ein Terminal ein, um alle Umgebungsvariablen zu drucken:

printenv

Weitere Informationen zu diesem Befehl finden Sie in der printenvManpage .


Um eine Liste mit den "Shell-Variablen" anzuzeigen, geben Sie den folgenden Befehl ein:

( set -o posix ; set ) | less

Dies zeigt Ihnen nicht nur die Shell-Variablen, sondern auch die Umgebungsvariablen.

Weitere Informationen zu diesem Thema finden Sie unter:


Für zsh: (eine erweiterte Shell)

Verwenden Sie den folgenden Befehl:

( setopt posixbuiltin; set; ) | less

Weitere Informationen zu ZSH-Optionen finden Sie auf der zshoptionsManpage .

Lucio
quelle
14
Wenn ich zum Terminal gehe und schreibe MYNEWVARIABLE=Ubuntuund ausführe, wird printenves dort nicht angezeigt. Warum ist das so und wie zeigen sich diese anderen?
Strapakowsky
4
Wahrscheinlich sehen Sie den Unterschied zwischen einer Shell-Variablen und einer Umgebungsvariablen. Probieren Sie es aus export MYNEWVARIABLE=Ubuntuund es wird so funktionieren, wie Sie es erwarten.
Rmano
3
Wenn Sie einfach ausführen set, wird auch die von Ihnen erstellte Variable aufgelistet. Oder tunset | grep myvar
Sergiy Kolodyazhnyy
4
printenvist ein externer Befehl, der nur exportierte Umgebungsvariablen kennt (und druckt). setist ein interner Bash-Befehl, der alle "Shell-Variablen" (nicht exportierte Umgebungsvariablen) sowie die exportierten Umgebungsvariablen anzeigt.
Dan Pritts
1
Um die Antwort von @ Rmano auf @Strapakowsky zu erweitern ... Das wird nicht funktionieren unset MYNEWVARIABLE; MYNEWVARIABLE=Ubuntu; printenv | grep MYNEW, aber das wird unset MYNEWVARIABLE; export MYNEWVARIABLE=Ubuntu; printenv | grep MYNEWund das wird unset MYNEWVARIABLE; MYNEWVARIABLE=Ubuntu printenv | grep MYNEW. Beim Exportieren heißt es: "Die von mir festgelegte Variable sollte Teil der Umgebung sein, die an Prozesse übergeben wird, und nicht nur eine Variable in dieser Shell." Mein drittes Beispiel besagt: "Die Variable sollte Teil der Umgebung sein, die an DIESEN Prozess übergeben wird, aber nicht danach hängenbleiben."
Bruno Bronosky
52

Ich weiß, dass diese Frage ziemlich alt und beantwortet ist, aber ich denke, ich kann ein paar nützliche Informationen hinzufügen.

In allen oben beschriebenen Methoden wird folgende Vorgehensweise vorgeschlagen:

  • Starten Sie ein Terminal
  • Zeige die Umgebungsvariablen mit env, oder printenvoder was auch immer

Das Problem dieser Lösungen besteht darin, dass Sie die Umgebungsvariablen der Shell sehen, die auf dem Terminal ausgeführt wird . Die Umgebungsvariablen, die einer Anwendung zur Verfügung stehen, werden beispielsweise nicht direkt von der grafischen Oberfläche ausgeführt.

Dies macht sich beispielsweise bemerkbar, wenn Sie die Umgebungsvariablen mit ~/.profileoder .bashrcoder .zshenv(abhängig von Ihrer Shell) ändern - wie beim klassischen Hinzufügen von Verzeichnissen zum Pfad.

Um zu sehen, welche Umgebungsvariablen für die Anwendung verfügbar sind, die direkt in der grafischen Umgebung gestartet wurde, können Sie Folgendes tun (in der Gnome-Shell gibt es sicher eine entsprechende Methode in allen anderen DEs):

  • drücke Alt-F2
  • Führen Sie den Befehl aus xterm -e bash --noprofile --norc

(Oder, falls nicht xterm, gnome-terminal -- bash --noprofile --norc--- danke an @Mike Nakis für den Kommentar).

Sie haben jetzt ein Terminal mit einer Shell, die keine Umgebungsvariablen hinzugefügt hat. Hier können Sie envalle Umgebungsvariablen auflisten:

Beispiel für die Rohkarosserie

Offensichtlich werden in der neuen Shell die Umgebungsvariablen von den Systemdateien hinzugefügt, aber diese Variablen sollten ohnehin (durch Vererbung) für alle Programme im System verfügbar sein.

Ich poste dies, weil ich diesen Trick zum vierten Mal erneut durchsuchen und meine .pam_environmentDatei überprüfen muss . So, jetzt werde ich es schneller finden (und dabei hoffe ich, jemand anderem zu helfen ...)

Rmano
quelle
Benötigt eine Desktop-Umgebung, die für reine Server-CLI-Benutzer nicht geeignet ist.
K7AAY
5
Ja --- aber für CLI ist nur die vorherige Antwort in Ordnung. Ich habe nur darauf hingewiesen, dass Sie manchmal Umgebungsvariablen überprüfen müssen, die für die von der grafischen Umgebung gestartete Anwendung verfügbar sind. Dies ist nicht derselbe Satz, den Sie sehen, wenn Sie ein Terminal darin starten. Wenn Sie beispielsweise versuchen zu verstehen, warum Ihre Kile-App keine LaTeX-Datei kompilieren kann, während dies in einem Terminal möglich ist, hilft der hier veröffentlichte Trick sehr.
Rmano
3
Vielen Dank für eine sehr nützliche Antwort! Ich habe soeben einen Link
Gunnar Hjalmarsson am
Vielen Dank. Haben Sie empfohlen, xterm -e bash --noprofile --norcweil die Startdateien nicht gelesen und ausgeführt werden, wenn Ubuntu mit einer grafischen Oberfläche gestartet wird? Siehe askubuntu.com/q/1025845/1471
Tim
1
Der richtige Befehl zur Ausführung ist heute (Ubuntu 18.04)gnome-terminal -- bash --noprofile --norc
Mike Nakis
45

Sie können alle Variablen mit dem declareeingebauten sehen.

declare -p

Wenn Sie nur an Umgebungsvariablen interessiert sind, verwenden Sie

declare -xp

Führen help declareSie den Befehl aus, um die anderen Optionen anzuzeigen.

geirha
quelle
dies ist bei weitem nicht ordentlich-er - Lösung als POSIXLY_CORRECT=1 setund es ist auch erwähnenswert , dass declareist alias(in diesem Zusammenhang) für typeset, eine andere bash builtin.
1
Das ist die richtige Antwort.
Florin Andrei
12

Um die Umgebungsvariablen im Terminal mit CTRL+ ALT+ Taufzulisten, können Sie den envBefehl verwenden.

beispielsweise :

[raja@localhost ~]$ env
XDG_VTNR=1
SSH_AGENT_PID=3671
XDG_SESSION_ID=3
HOSTNAME=localhost.localdomain
IMSETTINGS_INTEGRATE_DESKTOP=yes
GPG_AGENT_INFO=/home/raja/.gnupg/S.gpg-agent:3691:1
GLADE_PIXMAP_PATH=:
TERM=xterm-256color
SHELL=/bin/bash
XDG_MENU_PREFIX=xfce-
DESKTOP_STARTUP_ID=
HISTSIZE=1000
XDG_SESSION_COOKIE=0250277dd805498381e96c05d88068b0-1364679772.845276-1676152201
WINDOWID=65011716
GNOME_KEYRING_CONTROL=/home/raja/.cache/keyring-N3QoQ2
IMSETTINGS_MODULE=none
QT_GRAPHICSSYSTEM_CHECKED=1
USER=raja

usw.

Ich hoffe, das hilft.

rɑːdʒɑ
quelle
Ich habe bemerkt, dass env einige Variablen o_O vermisst. speziell nach der Beschaffung einer VAR = VAL-Datei.
ThorSummoner
1
@ThorSummoner Die Antwort hier könnte helfen, stackoverflow.com/questions/15474650/…
Georaldc
7

In der Bash mit compgen:

compgen -v | while read line; do echo $line=${!line};done  
tmgoblin
quelle
2
Dies sollte die akzeptierte Antwort sein, da alle anderen mehr als nur den Namen selbst auflisten. In meinem Fall enthalten einige Variablen mehrzeilige Werte, was die anderen Lösungen nicht durchführbar macht.
Mene
1
Eine Variante:compgen -v | while read line; do declare -p $line; done
Eljay
4

Die meisten Lösungen hier geben entweder nur Umgebungsvariablen aus oder haben den Nachteil, dass env oder (set -o posix; posix) keine Werte in syntaktischer Form ausgeben (versuchen Sie, die Variable A = $ 'a \ r \ nb' zu drucken ...). .

Hier ist eine Funktion, die alle Variablen, eine Variable pro Zeile, in der mit POSIX-Escapezeichen versehenen Form ausgibt:

function dump_vars {
    local VARNAME
    compgen -v | while read -r VARNAME; do
        printf "$VARNAME=%q\n" "${!VARNAME}"
    done
}

Vielen Dank an @tmgoblin für den Hinweis auf die Verwendung von compgen -v.

Ján Lalinský
quelle
1
Hervorragende erste Antwort! +1 Mach weiter so!
Fabby
3

env ist ein POSIX 7 Weg :

export asdf=qwer
env | grep asdf

Beispielausgabe:

asdf=qwer

Es werden nur exportierte Variablen angezeigt: Nicht exportierte Variablen werden normalerweise nicht als "Umgebungsvariablen" betrachtet.

Ziehen Sie das vor printenv, was nicht POSIX ist. Beide scheinen dasselbe ohne Argumente zu tun: https://unix.stackexchange.com/questions/123473/was-ist-der- Unterschied-zwischen-env-und-printenv

Ciro Santilli ist ein Schauspieler
quelle
Bereits vor zwei Jahren erwähnt: askubuntu.com/a/276162/158442
muru
@muru fair genug. Ich wünschte, es wäre durch enveine bessere Formatierung sichtbarer geworden, und ich hätte weitere Informationen hinzugefügt.
Ciro Santilli新疆改造中心法轮功六四事件
Dafür ist das Bearbeiten da .
muru
2

Wenn Sie eine bestimmte Umgebungsvariable möchten, anstatt sie alle mit zu printenvdrucken, können Sie sie beispielsweise folgendermaßen druckenecho "$PWD"

inigo333
quelle
0

printenv listet nur exportierte Variablen auf, command+ alt+ $ ("\ e $": complete-variable) listet alle Variablen auf.

user1133275
quelle