Comment afficher la valeur actuelle d'une variable d'environnement?

24

Lorsque je vérifie l'environnement de mon système, de nombreuses variables environnementales apparaissent. Comment puis-je simplement rechercher une variable particulière?

Un livre que je lis dit:

Parfois, le nombre de variables dans votre environnement devient assez important, à tel point que vous ne voulez pas voir toutes les valeurs affichées lorsque vous êtes intéressé par une seule. Si tel est le cas, vous pouvez utiliser la echocommande pour afficher la valeur actuelle d'une variable d'environnement.

Comment faire cela dans un terminal Linux?

iLearnSlow
la source

Réponses:

25

Juste:

echo "$VARIABLENAME"

Par exemple pour la variable d'environnement $HOME, utilisez:

echo "$HOME"

Qui imprime alors quelque chose de similaire à:

/home/username

Edit : selon le commentaire de Stéphane Chazelas , il vaut peut-être mieux utiliser printenvau lieu de echo:

printenv HOME
le chaos
la source
4
Vous avez oublié les guillemets (sauf si vous impliquez la syntaxe zsh ou rc / es). echoest un mauvais choix de commande car il pourrait transformer le contenu de la variable. Il affichera le contenu du paramètre shell du même nom. Ce n'est pas nécessairement la même chose si vous utilisez le Bourne shell ou pour des vars env comme 1, *par exemple. Et vous ne pouvez pas utiliser cette approche pour les vars env dont le nom n'est pas valide en tant que nom de variable shell.
Stéphane Chazelas
5
Notez également que s'il existe plusieurs entrées d'environnement portant le même nom (OK, un cas pathologique), celle que vous obtiendrez dépendra de la coque (généralement la première ou la dernière). printenv VARles affichera tous (au moins pour l'implémentation GNU).
Stéphane Chazelas
9

En exécutant:

printenv

Vous verrez toutes les variables d'environnement. Pour plus d'informations, vous pouvez consulter:

https://www.digitalocean.com/community/tutorials/how-to-read-and-set-environmental-and-shell-variables-on-a-linux-vps

Svetlin Tonchev
la source
2
Pour se rapprocher de la réponse à la question, printenv variablenamen'affichera que la variable nommée; par exemple, printenv  HOMEfera à peu près la même chose que echo  "$HOME".
G-Man dit `` Réintègre Monica ''
5

Il est important de comprendre que chaque processus a son propre ensemble de variables d'environnement.

Lorsqu'un processus appelle l' fork()appel système, un deuxième processus (l' enfant ) identique au premier ( le parent ) est créé (cette copie inclut l'environnement, qui se trouve juste au-dessus de la pile (ou juste en dessous, selon la façon dont vous pensez des piles :-)- mais sous unix / linux, la pile se développe à partir d'adresses élevées).

Habituellement, le processus enfant appellera alors l'appel execve()système, qui jettera tout dans sa mémoire (virtuelle) et le reconstruira à partir du code et des sections de données dans le fichier binaire spécifié.

Cependant, quand il reconstruit la pile, il copie l'environnement et les chaînes d'arguments passées à execve()la pile en premier (dans cet ordre), avant d'appeler la main()fonction (une grande partie du travail est effectuée dans le crt0code de démarrage après les execve()retours (à l' entrée point spécifié dans le binaire)).

Il y a des wrappers pour l' execve()appel système dans la bibliothèque C qui passeront l'environnement actuel (c'est-à-dire une copie de l'environnement des parents), au lieu que l'appelant le fournisse (donc en fait l'enfant héritera de l'environnement des parents) - voir environ(7).

Essayez d'exécuter (en tant que root) la commande ps axeww | less... cela vous montrera l'environnement pour tous les processus! Un processus intéressant est l'ID de processus 1 (c'est-à-dire le initprocessus - le premier processus créé par le noyau au démarrage).

Si vous souhaitez examiner l'environnement d'un processus spécifique (et vous savez que c'est l'ID de processus), essayez d'exécuter la commande cat /proc/<PID>/environ(en la remplaçant <PID>par l'ID de processus).

Notez que si un processus a suffisamment de privilèges, il peut réécrire sa propre pile, ce qui peut rendre difficile la connaissance de son environnement - vous verrez des processus démon comme celui-ci dans la sortie ps.

Mais à la fin, toute cette gaufre se résume à ce que @chaos a dit ci-dessus, si vous voulez regarder la valeur actuelle d'une variable d'environnement spécifique dans votre processus shell, utilisez simplement la commande echo "$<NAME>"( intégrée) (en remplaçant <NAME>par le nom de la variable d’environnement qui vous intéresse) ... sachez que la même variable peut avoir une valeur différente, ou n’exister pas du tout, dans un autre processus.

Murray Jensen
la source
1
(1) Notez que l' eoption pset le /proc/…/environfichier spécial peuvent ne pas exister sur tous les systèmes. (2) AFAIK, chaque processus Unix a le privilège de réécrire sa pile et de modifier ses variables d'environnement. (3) Pour plus de détails, voir À qui appartiennent les variables d'environnement? (sur super utilisateur ).
G-Man dit `` Réintègre Monica ''
Je pensais que certains systèmes avaient un moyen d'empêcher un processus non privilégié de "cacher" ses arguments de ligne de commande et son environnement, par exemple, à partir de root ps... mais maintenant que vous avez souligné ce point, je ne me souviens pas pourquoi je pensé que.
Murray Jensen
@MurrayJensen selon une discussion sur la question très votée que j'ai posée sur «curl» cachant ses arguments dans ps - il n'est pas spécifié dans POSIX si ps retourne les arguments tels qu'ils ont été initialement transmis au processus, ou une copie que le processus peut avoir modifiée après lui a commencé. Certains systèmes (je pense que Solaris ??) montre les arguments d'origine quoi qu'il arrive. (Voici le lien.) C'est peut-être à cela que vous pensiez. :)
Wildcard
Bingo! Oui, bien sûr, Solaris le fait "correctement" :-) Merci pour le rafraîchissement ...
Murray Jensen
1

Vous pouvez obtenir ce que vous cherchez avec export:

export | grep HOME

Affiche le contenu de la $HOMEvariable.

Dark Egregious
la source
1

si vous devez définir un grand nombre de vars:

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

après les avoir réglés:

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

que d'afficher ce qui a été défini:

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

De cette façon, vous vous retrouverez bientôt, travaillant avec plusieurs ensembles de vars shell prédéfinis dans des fichiers cnf, qui, combinés avec tmux, feront de vous le maître de la gestion de la configuration dans les environnements shell:

  # ---------------------------------------------------------
  # 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 $_ "'
  }
Yordan Georgiev
la source