Comment lister tous les noms de variables et leurs valeurs actuelles?

348

Comment lister tous les noms de variables et leurs valeurs actuelles?

Y compris non seulement $HOME, $PWDetc. mais tout autre que vous avez défini.

Strapakowsky
la source
3
superuser.com/questions/420295/…
Ciro Santilli a annoncé
Vous avez accepté une réponse incorrecte. "printenv" ne vous donne que les variables d'environnement. Si vous voulez vraiment que toutes les variables soient déclarées dans votre shell, utilisez "declare -p" ou "typeset -p".
Florin Andrei le

Réponses:

479

Pour bash: (le shell standard sous Ubuntu)

Entrez la commande suivante dans un terminal pour imprimer toutes les variables d'environnement:

printenv

Pour plus d'informations sur cette commande, lisez la printenvpage de manuel .


Pour afficher une liste comprenant les "variables shell", vous pouvez entrer la commande suivante:

( set -o posix ; set ) | less

Cela vous montrera non seulement les variables shell, mais aussi les variables d'environnement.

Pour plus d'informations sur ce sujet, lisez:


Pour zsh: (un shell avancé)

Utilisez la commande suivante:

( setopt posixbuiltin; set; ) | less

Pour plus d'informations sur les options ZSH, voir la zshoptionspage de manuel .

Lucio
la source
14
Si je vais au terminal et écris MYNEWVARIABLE=Ubuntuet exécute printenvça ne montre pas là. Pourquoi est-ce, et comment ces autres apparaissent-ils?
Strapakowsky
4
Vous voyez probablement la différence entre une variable shell et une variable d'environnement. Essayez export MYNEWVARIABLE=Ubuntuet cela fonctionnera comme prévu.
Rmano
3
si vous exécutez simplement set, il liste également la variable créée par vous. Ou faireset | grep myvar
Sergiy Kolodyazhnyy
4
printenvest une commande externe, elle ne connait donc que (et imprime) les variables d'environnement exportées. setest une commande interne bash, elle affiche donc toutes les "variables shell" (variables d’environnement non exportées) ainsi que les variables d’environnement exportées.
Dan Pritts
1
Pour développer la réponse de @ Rmano à @Strapakowsky ... Cela ne fonctionnera pas unset MYNEWVARIABLE; MYNEWVARIABLE=Ubuntu; printenv | grep MYNEW, mais cela fonctionnera unset MYNEWVARIABLE; export MYNEWVARIABLE=Ubuntu; printenv | grep MYNEWet ce sera le cas unset MYNEWVARIABLE; MYNEWVARIABLE=Ubuntu printenv | grep MYNEW. L'exportation indique "la variable que je suis en train de définir devrait faire partie de l'environnement qui est passé aux processus, pas seulement une variable de ce shell". Mon troisième exemple dit "la variable doit faire partie de l'environnement qui est transmis à THIS processus, mais ne doit pas rester après."
Bruno Bronosky
52

Je sais que cette question est assez ancienne et a répondu, mais je pense pouvoir ajouter quelques informations utiles.

Dans toutes les méthodes décrites ci-dessus, la procédure suggérée est la suivante:

  • lancer un terminal
  • montrer les variables d'environnement en utilisant env, ou printenvou quoi que

Le problème de ces solutions est que vous voyez les variables d'environnement du shell s'exécutant sur le terminal . Vous ne voyez pas les variables d'environnement disponibles pour une application s'exécuter, par exemple, directement par l'interface graphique.

Cela se remarque si, par exemple, vous utilisez votre ~/.profile, ou .bashrc, ou .zshenv(selon votre shell) pour modifier les variables d'environnement - comme l'ajout classique de répertoires au chemin.

Pour voir les variables d'environnement disponibles pour l'application démarrées directement dans l'environnement graphique, vous pouvez procéder comme suit (dans Gnome Shell, je suis sûr qu'il existe une méthode équivalente dans tous les autres DE):

  • appuyez sur Alt-F2
  • lancer la commande xterm -e bash --noprofile --norc

(Ou, si vous n'en avez pas xterm, gnome-terminal -- bash --noprofile --norc--- merci à @ Mike Nakis pour le commentaire).

Vous avez maintenant un terminal avec un shell qui n'a ajouté aucune variable d'environnement. Vous pouvez utiliser envici pour lister toutes vos variables d'environnement:

Exemple de coque nue

Il est évident que les fichiers d’environnement seront ajoutés aux variables d’environnement du nouveau shell, mais que ces variables doivent de toute façon être disponibles (par héritage) pour tous les programmes du système.

Je poste ceci parce que c'est la quatrième fois que je dois effectuer une nouvelle recherche sur cette astuce en vérifiant mon .pam_environmentdossier. Alors maintenant, je vais le trouver plus rapidement (et dans le processus, j'espère aider quelqu'un d'autre ...)

Rmano
la source
Vous devez disposer d'un environnement de bureau, ce qui n'est pas utile pour les utilisateurs de CLI de serveur uniquement.
K7AAY
5
Oui --- mais alors pour la CLI, seule la réponse précédente est ok. Je soulignais simplement que vous devez parfois vérifier les variables d'environnement disponibles pour les applications démarrées par l'environnement graphique, ce qui n'est pas le même que celui que vous voyez lorsque vous démarrez un terminal dans celui-ci. Par exemple, si vous essayez de comprendre pourquoi votre application Kile ne peut pas compiler un fichier LaTeX, alors que dans un terminal, vous le pouvez, le truc que j'ai publié ici aidera beaucoup.
Rmano
3
Merci pour une réponse très utile! Je viens de la relier depuis help.ubuntu.com/community/…
Gunnar Hjalmarsson le
Merci. Avez-vous recommandé xterm -e bash --noprofile --norccette option, car les fichiers de démarrage ne sont ni lus ni exécutés lors du démarrage d'Ubuntu avec une interface graphique? Voir le site askubuntu.com/q/1025845/1471
Tim
1
la bonne commande à exécuter de nos jours (Ubuntu 18.04) estgnome-terminal -- bash --noprofile --norc
Mike Nakis
45

Vous pouvez voir toutes les variables avec la commande declareintégrée.

declare -p

Si vous ne vous intéressez qu'aux variables d'environnement, utilisez

declare -xp

Exécuter help declarepour voir quelles sont les autres options.

geirha
la source
ce qui est loin solution heu propre que POSIXLY_CORRECT=1 setet il est également digne de mention qui declareest alias(dans ce contexte) pour typesetun autre builtin bash.
1
C'est la bonne réponse.
Florin Andrei le
12

Pour lister les variables d'environnement dans le terminal avec CTRL+ ALT+, Tvous pouvez utiliser la envcommande.

par exemple :

[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

etc.

J'espère que ça t'as aidé.

rɑːdʒɑ
la source
J'ai remarqué que env manque certaines variables o_O. spécifiquement après avoir recherché un fichier VAR = VAL.
ThorSummoner
1
@ThorSummoner La réponse ici pourrait aider stackoverflow.com/questions/15474650/…
georaldc
7

Dans bash en utilisant compgen:

compgen -v | while read line; do echo $line=${!line};done  
tmgoblin
la source
2
Cela devrait être la réponse acceptée, car tous les autres énumèrent plus que le nom lui-même. Dans mon cas, certaines variables contiennent des valeurs multilignes, ce qui rend les autres solutions non réalisables.
Mene
1
Une variante:compgen -v | while read line; do declare -p $line; done
Eljay
4

Ici, la plupart des solutions n'impriment que des variables d'environnement ou ont pour inconvénient que env ou (set -o posix; posix) n'imprime pas les valeurs sous une forme analysable (essayez d'imprimer la variable A = $ 'a \ r \ nb' ...). .

Voici une fonction qui imprimera toutes les variables, une variable par ligne, sous la forme d'échappement POSIX:

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

Merci à @tmgoblin d'avoir signalé l'utilisation de compgen -v.

Ján Lalinský
la source
1
Excellente première réponse! +1 Continuez votre bon travail!
Fabby
3

env est une méthode POSIX 7 :

export asdf=qwer
env | grep asdf

Exemple de sortie:

asdf=qwer

Elle ne montre que les variables exportées: les variables non exportées ne sont généralement pas considérées comme des "variables d'environnement".

Préférez cela printenv, ce qui n'est pas POSIX. Les deux semblent faire la même chose sans arguments: https://unix.stackexchange.com/questions/123473/what-is-the-difference-between-env-and-printenv

Ciro Santilli 改造 中心 六四 事件
la source
Déjà mentionné il y a deux ans: askubuntu.com/a/276162/158442
muru
@muru juste assez. envJ'aurais aimé qu'il soit plus visible avec une meilleure mise en forme, et j'ai ajouté plus d'informations.
Ciro Santilli a rejoint le forum
C'est à quoi sert l' édition .
muru
2

Si vous voulez une variable d’environnement spécifique, plutôt que de les imprimer toutes avec printenv, vous pouvez par exemple l’imprimer en faisantecho "$PWD"

inigo333
la source
0

printenv ne liste que les variables exportées, command+ alt+ $ ("\ e $": variable complète) listera toutes les variables.

utilisateur1133275
la source