Come mostrare il valore corrente di una variabile d'ambiente?


24

Quando controllo l'ambiente del mio sistema, compariranno molte variabili ambientali. Come posso semplicemente cercare una particolare variabile?

Un libro che sto leggendo dice:

A volte il numero di variabili nel tuo ambiente diventa abbastanza grande, al punto che non vuoi vedere tutti i valori visualizzati quando sei interessato a una sola. In tal caso, è possibile utilizzare il echocomando per mostrare il valore corrente di una variabile di ambiente.

Come posso farlo in un terminale Linux?

Risposte:


25

Appena:

echo "$VARIABLENAME"

Ad esempio per la variabile di ambiente $HOME, utilizzare:

echo "$HOME"

Che quindi stampa qualcosa di simile a:

/home/username

Modifica : secondo il commento di Stéphane Chazelas , potrebbe essere meglio se usi printenvinvece di echo:

printenv HOME

4
Hai dimenticato le virgolette (a meno che tu non stia implicando la sintassi zsh o rc / es). echoè una cattiva scelta di un comando in quanto potrebbe trasformare il contenuto della variabile. Produrrà il contenuto del parametro shell con lo stesso nome. Questo non è necessariamente lo stesso se si utilizza la shell Bourne o per ambienti simili 1, *ad esempio. E non puoi usare questo approccio per env var il cui nome non è valido come nome di variabile di shell.
Stéphane Chazelas,

5
Si noti inoltre che se esistono più voci di ambiente con lo stesso nome (OK, un caso patologico), quale si otterrà dipende dalla shell (di solito la prima o l'ultima). printenv VARli visualizzerà tutti (almeno per l'implementazione GNU).
Stéphane Chazelas,

9

Eseguendo:

printenv

Vedrai tutte le variabili d'ambiente. Per maggiori informazioni puoi dare un'occhiata a:

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


2
Per avvicinarsi effettivamente alla risposta alla domanda, printenv variablenameverrà visualizzata solo la variabile denominata; ad esempio, printenv  HOMEfarà approssimativamente la stessa cosa di echo  "$HOME".
G-Man dice "Ripristina Monica" il

5

È importante capire che ogni processo ha il proprio set di variabili d'ambiente.

Quando un processo chiama la fork()chiamata di sistema, viene creato un secondo processo (il figlio ) identico al primo ( il genitore ) (questa copia include l'ambiente, che si trova appena sopra lo stack (o appena sotto, a seconda di come pensi agli stack :-)) ma in Unix / Linux lo stack cresce verso il basso dalle alte indirizzi).

Di solito, il processo figlio chiamerà quindi la chiamata di execve()sistema, che eliminerà tutto nella sua memoria (virtuale) e la ricostruirà dalle sezioni di codice e dati nel file binario specificato.

Tuttavia, quando ricostruisce lo stack, copia l'ambiente e le stringhe di argomenti passate allo execve()stack prima (in quell'ordine), prima di chiamare la main()funzione (gran parte del lavoro viene eseguito nel crt0codice bootstrap dopo i execve()ritorni (alla voce punto specificato nel binario)).

Ci sono wrapper per la execve()chiamata di sistema nella libreria C che passerà l'ambiente corrente (cioè una copia dell'ambiente genitore), invece del chiamante che lo fornisce (quindi in effetti il ​​figlio erediterà l'ambiente del genitore) - vedi environ(7).

Prova a eseguire (come root) il comando ps axeww | less... questo ti mostrerà l'ambiente per tutti i processi! Un interessante è l'ID processo 1 (ovvero il initprocesso - il primo processo creato dal kernel all'avvio).

Se si desidera esaminare l'ambiente per un processo specifico (e si sa che è ID processo), provare a eseguire il comando cat /proc/<PID>/environ(sostituendolo <PID>con ID processo).

Nota che se un processo ha abbastanza privilegi, può riscrivere il proprio stack, il che può rendere difficile sapere quale sia il suo ambiente - vedrai alcuni processi daemon come questo nell'output ps.

Ma alla fine, tutto questo waffle si riduce a ciò che @chaos ha detto sopra, se vuoi guardare il valore corrente di una variabile d'ambiente specifica nel tuo processo di shell, usa semplicemente il comando echo "$<NAME>"( incorporato) (sostituendo <NAME>con il nome del variabile di ambiente che ti interessa) ... tieni presente che la stessa variabile può avere un valore diverso o non esistere affatto in un altro processo.


1
(1) Notare che l' eopzione pse il /proc/…/environfile speciale potrebbero non esistere su tutti i sistemi. (2) AFAIK, ogni processo Unix ha il privilegio di riscrivere il suo stack e modificare le sue variabili di ambiente. (3) Per ulteriori discussioni, vedere A chi appartengono le variabili di ambiente? (su Super User ).
G-Man dice "Ripristina Monica" il

Avevo in mente che alcuni sistemi avevano un modo per impedire a un processo senza privilegi di "nascondere" i suoi argomenti della riga di comando e l'ambiente, ad esempio dal root in esecuzione ps... ma ora che hai evidenziato questo punto, non riesco a ricordare perché pensavo che.
Murray Jensen,

@MurrayJensen secondo alcune discussioni sulla domanda molto votata che ho posto riguardo al "ricciolo" nascondendo i suoi argomenti in ps - non è specificato in POSIX se ps restituisce gli argomenti come originariamente passati al processo o una copia che il processo potrebbe aver modificato dopo ha cominciato. Qualche sistema (penso Solaris ??) mostra gli argomenti originali, non importa quale. (Ecco il link.) Potrebbe essere stato quello a cui stavi pensando. :)
Wildcard il

Bingo! Sì, certo Solaris lo fa "correttamente" :-) Grazie per l'aggiornamento ...
Murray Jensen,

1

Puoi ottenere quello che stai cercando con export:

export | grep HOME

Mostrerà il contenuto della $HOMEvariabile.


1

se devi impostare molti parametri:

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

dopo averli impostati:

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

di visualizzare ciò che è stato impostato:

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

In questo modo ti ritroverai presto, lavorando con più set di shell shell predefiniti nei file cnf, che combinati con tmux ti renderanno il padrone della gestione della configurazione negli ambienti 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 $_ "'
  }
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.