In un terminale Linux bash, ci sono spesso molte variabili d'ambiente che sono state impostate, come $PATH
e $HOME
.
È possibile vedere tutte le variabili d'ambiente che sono state impostate? Come?
In un terminale Linux bash, ci sono spesso molte variabili d'ambiente che sono state impostate, come $PATH
e $HOME
.
È possibile vedere tutte le variabili d'ambiente che sono state impostate? Come?
Risposte:
TL; DR: usare(set -o posix ; set)
Secondo il manuale di Bash puoi usare il set
comando integrato per mostrare tutte le variabili d'ambiente che sono state impostate. Il set
comando mostrerà anche le definizioni di qualsiasi funzione. Se si desidera visualizzare solo le variabili e non le funzioni, è possibile attivare la modalità POSIX prima di eseguire il comando set. Il modo più semplice per farlo è con set -o posix
, ma che lascerà attiva la modalità POSIX fino a quando non la spegni set +o posix
.
Pertanto, il comando seguente mostrerà tutte le variabili d'ambiente definite usando una subshell senza influire sulla conformità POSIX nella shell corrente.
(set -o posix ; set)
@RedGrittyBrick e @iglvzx hanno suggerito di utilizzare il env
comando, tuttavia questo comando non fornirà un elenco completo delle variabili di ambiente. env
mostrerà solo le variabili che sono state contrassegnate per l'esportazione. Confronta l'output di env | sort
e export -p
vedrai cosa intendo. È possibile eseguire comm -23 <(set -o posix; set) <(env|sort)
se si desidera vedere quali variabili di ambiente non vengono esportate.
Il motivo della discrepanza è che env
è un eseguibile separato rispetto al set
quale è un comando incorporato della shell. Secondo il manuale di Bash, quando viene eseguito un comando che non è un comando o una funzione incorporati nella shell, riceverà solo variabili di ambiente che sono state contrassegnate per l'esportazione in Bash . Esistono molte variabili che non vengono esportate. Pertanto, se si desidera visualizzare tutte le variabili definite dalla shell, è necessario utilizzare il set
comando come indicato nel manuale.
Puoi facilmente provare questo comportamento da solo usando i seguenti comandi.
MY_TEST_VARIABLE="This is my test variable."
set | grep MY_TEST_VARIABLE
env | grep MY_TEST_VARIABLE
Vedrai che set
fornisce output mentre env
non lo è.
Il env
comando senza argomenti stamperà un elenco delle variabili di ambiente "esportate" e dei loro valori. Queste variabili sono rese visibili ai sottoprocessi - molte altre variabili d'ambiente non sono mostrate con questo, e sono usate solo all'interno della shell in esecuzione, ad es. Per la configurazione.
printenv
, dal momento che entrambi env
e set
hanno altre funzioni che solo l'emissione nell'ambiente.
env
stamperà solo un elenco di variabili d'ambiente che sono state contrassegnate per l'esportazione. Non stamperà tutte le variabili.
compgen -v
stampa le variabili della shell (ma non i valori).
compgen -e
stampa le variabili esportate, ovvero quelle che vengono ereditate dai processi avviati da questa shell (ma non dai loro valori).
Differenza tra shell e variabili esportate: https://unix.stackexchange.com/questions/3507/difference-between-environment-variables-and-exported-environment-variables-in-b?rq=1
compgen -e
è esattamente quello che volevo!