Wie liste ich alle Variablennamen und ihre aktuellen Werte auf?
Und zwar nicht nur $HOME
, $PWD
usw. , aber andere haben Sie definiert.
Wie liste ich alle Variablennamen und ihre aktuellen Werte auf?
Und zwar nicht nur $HOME
, $PWD
usw. , aber andere haben Sie definiert.
Antworten:
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 printenv
Manpage .
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 zshoptions
Manpage .
MYNEWVARIABLE=Ubuntu
und ausführe, wird printenv
es dort nicht angezeigt. Warum ist das so und wie zeigen sich diese anderen?
export MYNEWVARIABLE=Ubuntu
und es wird so funktionieren, wie Sie es erwarten.
set
, wird auch die von Ihnen erstellte Variable aufgelistet. Oder tunset | grep myvar
printenv
ist ein externer Befehl, der nur exportierte Umgebungsvariablen kennt (und druckt). set
ist ein interner Bash-Befehl, der alle "Shell-Variablen" (nicht exportierte Umgebungsvariablen) sowie die exportierten Umgebungsvariablen anzeigt.
unset MYNEWVARIABLE; MYNEWVARIABLE=Ubuntu; printenv | grep MYNEW
, aber das wird unset MYNEWVARIABLE; export MYNEWVARIABLE=Ubuntu; printenv | grep MYNEW
und 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."
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:
env
, oder
printenv
oder was auch immerDas 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 ~/.profile
oder .bashrc
oder .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):
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 env
alle Umgebungsvariablen auflisten:
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_environment
Datei überprüfen muss . So, jetzt werde ich es schneller finden (und dabei hoffe ich, jemand anderem zu helfen ...)
xterm -e bash --noprofile --norc
weil die Startdateien nicht gelesen und ausgeführt werden, wenn Ubuntu mit einer grafischen Oberfläche gestartet wird? Siehe askubuntu.com/q/1025845/1471
gnome-terminal -- bash --noprofile --norc
Sie können alle Variablen mit dem declare
eingebauten sehen.
declare -p
Wenn Sie nur an Umgebungsvariablen interessiert sind, verwenden Sie
declare -xp
Führen help declare
Sie den Befehl aus, um die anderen Optionen anzuzeigen.
POSIXLY_CORRECT=1 set
und es ist auch erwähnenswert , dass declare
ist alias
(in diesem Zusammenhang) für typeset
, eine andere bash builtin.
Um die Umgebungsvariablen im Terminal mit CTRL+ ALT+ Taufzulisten, können Sie den env
Befehl 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.
In der Bash mit compgen:
compgen -v | while read line; do echo $line=${!line};done
compgen -v | while read line; do declare -p $line; done
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.
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
env
eine bessere Formatierung sichtbarer geworden, und ich hätte weitere Informationen hinzugefügt.
printenv listet nur exportierte Variablen auf, command+ alt+ $ ("\ e $": complete-variable) listet alle Variablen auf.