Come elencare tutti i nomi delle variabili e i loro valori correnti?


348

Come elencare tutti i nomi delle variabili e i loro valori correnti?

Incluso non solo $HOME, $PWDecc. Ma qualsiasi altro che tu abbia definito.



Hai accettato una risposta errata. "printenv" fornisce solo le variabili di ambiente. Se vuoi veramente tutte le variabili attualmente dichiarate nella tua shell, usa "declare -p" o "typeset -p".
Florin Andrei,

Risposte:


479

Per bash: (la shell standard in Ubuntu)

Immettere il seguente comando in un terminale per stampare tutte le variabili di ambiente:

printenv

Per ulteriori informazioni su questo comando, leggere la printenvpagina man .


Per mostrare un elenco comprendente le "variabili shell" è possibile inserire il comando successivo:

( set -o posix ; set ) | less

Questo mostrerà non solo le variabili della shell, ma anche le variabili di ambiente.

Per ulteriori informazioni su questo argomento leggi:


Per zsh: (una shell avanzata)

Utilizzare il comando seguente:

( setopt posixbuiltin; set; ) | less

Per maggiori informazioni sulle opzioni di ZSH, vedere la zshoptionspagina man .


14
Se vado al terminale e scrivo MYNEWVARIABLE=Ubuntued eseguo printenvnon viene mostrato qui. Perché è così e come si presentano quegli altri?
Strapakowsky

4
Probabilmente stai vedendo la differenza tra una variabile di shell e una variabile di ambiente. Prova export MYNEWVARIABLE=Ubuntue funzionerà come previsto.
Rmano,

3
se lo esegui semplicemente set, elenca anche la variabile creata da te. Oppure faiset | grep myvar
Sergiy Kolodyazhnyy il

4
printenvè un comando esterno, quindi conosce solo (e stampa) le variabili d'ambiente esportate. setè un comando bash interno, quindi mostra tutte le "variabili shell" (variabili d'ambiente non esportate) e le variabili d'ambiente esportate.
Dan Pritts,

1
Per espandere la risposta di @ Rmano a @Strapakowsky ... Questo non funzionerà unset MYNEWVARIABLE; MYNEWVARIABLE=Ubuntu; printenv | grep MYNEW, ma questo funzionerà unset MYNEWVARIABLE; export MYNEWVARIABLE=Ubuntu; printenv | grep MYNEWe questo funzionerà unset MYNEWVARIABLE; MYNEWVARIABLE=Ubuntu printenv | grep MYNEW. Usando export si dice "la variabile che sto impostando dovrebbe far parte dell'ambiente che viene passato ai processi, non solo una variabile in questa shell". Il mio terzo esempio dice "la variabile dovrebbe essere parte dell'ambiente che viene passato a QUESTO processo, ma non rimanere in attesa in seguito".
Bruno Bronosky,

52

So che questa domanda è piuttosto vecchia e ha risposto, ma penso di poter aggiungere un po 'di informazioni utili.

In tutti i metodi sopra descritti, la procedura suggerita è:

  • lanciare un terminale
  • mostra le variabili di ambiente usando envo printenvo qualunque altra cosa

Il problema di queste soluzioni è che stai vedendo le variabili di ambiente della shell che è in esecuzione nel terminale . Le variabili di ambiente non sono disponibili per l'esecuzione di un'applicazione, ad esempio direttamente dall'interfaccia grafica.

Ciò è evidente se, ad esempio, si utilizza il proprio ~/.profile, oppure .bashrcoppure .zshenv(a seconda della shell) per modificare le variabili di ambiente, come la classica aggiunta di directory al percorso.

Per vedere le variabili di ambiente disponibili per l'applicazione avviate direttamente nell'ambiente grafico, è possibile effettuare le seguenti operazioni (in Gnome Shell, sono sicuro che esiste un metodo equivalente in tutti gli altri DE):

  • premi Alt-F2
  • esegui il comando xterm -e bash --noprofile --norc

(O, se non lo hai xterm, gnome-terminal -- bash --noprofile --norc--- grazie a @Mike Nakis per il commento).

Ora hai un terminale con una shell che non ha aggiunto alcuna variabile d'ambiente. È possibile utilizzare envqui per elencare tutte le variabili di ambiente:

Esempio di guscio nudo

Ovviamente la nuova shell avrà le variabili d'ambiente aggiunte dai file di sistema, ma quelle variabili dovrebbero essere comunque disponibili (per ereditarietà) a tutti i programmi nel sistema.

Sto pubblicando questo perché è la quarta volta che devo cercare di nuovo questo trucco, controllando il mio .pam_environmentfile. Quindi ora lo troverò più velocemente (e nel processo, spero di aiutare qualcun altro ...)


Richiede un ambiente desktop, non utile per le persone solo CLI del server.
K7AAY,

5
Sì --- ma per CLI solo la risposta precedente è ok. Stavo solo sottolineando che a volte è necessario controllare le variabili di ambiente disponibili per l'applicazione avviata dall'ambiente grafico, che non è lo stesso set che si vede quando si avvia un terminale al suo interno. Ad esempio, se stai cercando di capire perché la tua app Kile non è in grado di compilare un file LaTeX, mentre in un terminale puoi farlo, il trucco che ho pubblicato qui sarà di grande aiuto.
Rmano,

3
Grazie per una risposta molto utile! Ho appena collegato ad esso da help.ubuntu.com/community/…
Gunnar Hjalmarsson

Grazie. Mi hai consigliato xterm -e bash --noprofile --norcperché i file di avvio non vengono letti ed eseguiti all'avvio di Ubuntu con interfaccia grafica? Vedi askubuntu.com/q/1025845/1471
Tim

1
il comando giusto per eseguire oggi (Ubuntu 18.04) ègnome-terminal -- bash --noprofile --norc
Mike Nakis,

45

Puoi vedere tutte le variabili con il declarebuiltin.

declare -p

Se sei interessato solo alle variabili d'ambiente, usa

declare -xp

Corri help declareper vedere quali sono le altre opzioni.


questa è una soluzione di gran lunga migliore di POSIXLY_CORRECT=1 seted è anche degno di menzione che declareè alias(in quel contesto) per typeset, un altro bash incorporato.

1
Questa è la risposta corretta
Florin Andrei,

12

Per elencare le variabili di ambiente nel terminale con CTRL+ ALT+ Tè possibile utilizzare il envcomando.

per esempio :

[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

eccetera.

spero che aiuti.


Ho notato che env manca alcune variabili o_O. in particolare dopo aver acquistato un file VAR = VAL.
ThorSummoner,

1
@ThorSummoner La risposta qui potrebbe aiutare stackoverflow.com/questions/15474650/...
georaldc

7

In bash usando compgen:

compgen -v | while read line; do echo $line=${!line};done  

2
Questa dovrebbe essere la risposta accettata, poiché tutti gli altri elencano più del semplice nome stesso. Nel mio caso alcune variabili contengono valori multilinea che rendono le altre soluzioni non realizzabili.
Mene,

1
Una variante:compgen -v | while read line; do declare -p $line; done
Eljay il

4

La maggior parte delle soluzioni qui stampa solo variabili di ambiente o presenta l'inconveniente che env o (set -o posix; posix) non stampano i valori in forma analizzabile (prova a stampare la variabile A = $ 'a \ r \ nb' ...) .

Ecco una funzione che stamperà tutte le variabili, una variabile per riga, nel modulo con escape POSIX:

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

Grazie a @tmgoblin per aver sottolineato l'uso di compgen -v.


1
Ottima prima risposta! +1 Continuate così!
Fabby,

3

env è un modo POSIX 7 :

export asdf=qwer
env | grep asdf

Uscita campione:

asdf=qwer

Mostra solo le variabili esportate: le variabili non esportate non sono generalmente considerate "variabili d'ambiente".

Preferisco questo printenv, che non è POSIX. Entrambi sembrano fare la stessa cosa senza argomenti: https://unix.stackexchange.com/questions/123473/what-is-the-difference-between-env-and-printenv


Già menzionato due anni fa: askubuntu.com/a/276162/158442
muru,

@muru abbastanza giusto. Vorrei che fosse reso envpiù visibile con una migliore formattazione e ho aggiunto più informazioni.
Ciro Santilli 30 改造 中心 法轮功 六四 事件

Ecco a cosa serve l' editing .
muru,

2

Se si desidera una variabile di ambiente specifica, anziché stamparle tutte con printenv, è possibile ad esempio stamparla facendoecho "$PWD"


0

printenv elenca solo le variabili esportate, command+ alt+ $ ("\ e $": variabile completa) elencherà tutte le variabili.

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.