Come elencare tutti i nomi delle variabili e i loro valori correnti?
Incluso non solo $HOME
, $PWD
ecc. Ma qualsiasi altro che tu abbia definito.
Come elencare tutti i nomi delle variabili e i loro valori correnti?
Incluso non solo $HOME
, $PWD
ecc. Ma qualsiasi altro che tu abbia definito.
Risposte:
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 printenv
pagina 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 zshoptions
pagina man .
MYNEWVARIABLE=Ubuntu
ed eseguo printenv
non viene mostrato qui. Perché è così e come si presentano quegli altri?
export MYNEWVARIABLE=Ubuntu
e funzionerà come previsto.
set
, elenca anche la variabile creata da te. Oppure faiset | grep myvar
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.
unset MYNEWVARIABLE; MYNEWVARIABLE=Ubuntu; printenv | grep MYNEW
, ma questo funzionerà unset MYNEWVARIABLE; export MYNEWVARIABLE=Ubuntu; printenv | grep MYNEW
e 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".
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 è:
env
o
printenv
o qualunque altra cosaIl 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 .bashrc
oppure .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):
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 env
qui per elencare tutte le variabili di ambiente:
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_environment
file. Quindi ora lo troverò più velocemente (e nel processo, spero di aiutare qualcun altro ...)
xterm -e bash --noprofile --norc
perché i file di avvio non vengono letti ed eseguiti all'avvio di Ubuntu con interfaccia grafica? Vedi askubuntu.com/q/1025845/1471
gnome-terminal -- bash --noprofile --norc
Puoi vedere tutte le variabili con il declare
builtin.
declare -p
Se sei interessato solo alle variabili d'ambiente, usa
declare -xp
Corri help declare
per vedere quali sono le altre opzioni.
POSIXLY_CORRECT=1 set
ed è anche degno di menzione che declare
è alias
(in quel contesto) per typeset
, un altro bash incorporato.
Per elencare le variabili di ambiente nel terminale con CTRL+ ALT+ Tè possibile utilizzare il env
comando.
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.
In bash usando compgen:
compgen -v | while read line; do echo $line=${!line};done
compgen -v | while read line; do declare -p $line; done
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.
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
env
più visibile con una migliore formattazione e ho aggiunto più informazioni.
printenv elenca solo le variabili esportate, command+ alt+ $ ("\ e $": variabile completa) elencherà tutte le variabili.