
Esiste più di un tipo di variabile d'ambiente su Linux. Scopri come visualizzarli, crearli per accessi locali e remoti e farli sopravvivere al riavvio.
Come funzionano le variabili d'ambiente
Quando si avvia una finestra terminale e la shell al suo interno, viene fatto riferimento a una raccolta di variabili per assicurarsi che la shell sia configurata correttamente. Queste variabili assicurano inoltre che siano disponibili tutte le informazioni a cui potrebbe essere necessario fare riferimento alla finestra del terminale e alla shell. Collettivamente, queste variabili mantengono le impostazioni che definiscono l'ambiente che si trova all'interno della finestra del terminale, fino all'aspetto del prompt dei comandi. Quindi, naturalmente, vengono definiti variabili di ambiente.
Alcune variabili di ambiente sono globali o di sistema. Gli altri sono a livello di sessione e possono essere visti solo da te. Altri non possono fare riferimento alle variabili di ambiente della sessione. Esiste un terzo set di variabili d'ambiente definite all'interno della shell. Le impostazioni internazionali, del fuso orario e della tastiera, il set di directory cercato quando la shell tenta di trovare un comando e l'editor predefinito, sono tutti memorizzati in variabili di ambiente shell.
Ti mostreremo come visualizzare le variabili di ambiente esistenti sul tuo sistema e descriveremo come crearne una tua. Ti mostreremo anche come renderli disponibili per i processi figlio e come essere persistenti durante i riavvii.
Ambienti ed ereditarietà
Quando inizia una shell, passa attraverso una fase di inizializzazione. È a questo punto che legge le variabili di ambiente che definiscono l'ambiente della shell.
Quando un programma o un comando viene lanciato da quella shell – noto come processo figlio – eredita l'ambiente del processo genitore – ma attenzione! Come vedremo, puoi creare variabili che non vengono aggiunte al tuo ambiente, quindi non saranno ereditate da un processo figlio.
Se il processo figlio è una shell, quella shell verrà inizializzata dal proprio set di variabili fresco. Pertanto, se si modifica il prompt dei comandi nella shell corrente e quindi si avvia una shell figlio, la shell figlio non erediterà il prompt dei comandi modificato del padre.
Variabili d'ambiente globali
Per convenzione, alle variabili di ambiente vengono assegnati nomi maiuscoli. Ecco alcune delle variabili d'ambiente globali e cosa rappresentano i valori che contengono:
- CONCHIGLIA: Il nome della shell che verrà avviata quando si apre una finestra del terminale. Sulla maggior parte delle distribuzioni Linux, questo sarà bash a meno che non sia stato modificato dal valore predefinito.
- TERMINE: Le finestre dei terminali sono in realtà emulazioni di un terminale hardware. Questo contiene il tipo di terminale hardware che verrà emulato.
- UTENTE: Il nome utente della persona corrente che utilizza il sistema.
- PWD: Il percorso della directory di lavoro corrente.
- OLDPWD: La directory in cui ti trovavi prima di passare alla directory di lavoro corrente.
-
LS_COLORS: L'elenco dei codici colore utilizzati da
lsevidenziare diversi tipi di file. -
MAIL: Se la
mailil sistema è stato impostato sul tuo computer Linux (per impostazione predefinita, non lo è), questo conterrà il percorso della cassetta postale dell'utente corrente. - SENTIERO: Un elenco di directory in cui la shell cercherà per trovare gli eseguibili dei comandi.
- LANG: La lingua, la localizzazione e le impostazioni di codifica dei caratteri.
- CASA: La home directory dell'utente corrente.
-
_: Il carattere di sottolineatura (
_) la variabile di ambiente contiene l'ultimo comando che è stato digitato.
RELAZIONATO: Come usare pushd e popd su Linux
Possiamo vedere che alcuni di questi sono impostati per utilizzare nulla di più sofisticato di echo, che scriverà i valori nella finestra del terminale. Per vedere il valore tenuto da una variabile d'ambiente, devi aggiungere un segno di dollaro ($) all'inizio del suo nome.
Un bel tocco è che puoi usare il completamento della scheda per compilare il nome della variabile di ambiente per te. Digita alcune lettere del nome e premi Tab. Il nome della variabile è completato dalla shell. Se ciò non accade, dovrai digitare qualche altra lettera per distinguere la variabile d'ambiente da altri comandi con nomi che iniziano con quelle stesse lettere:
echo $SHELL
echo $LANG
echo $HOME
echo $PWD

Per creare il tuo globale variabili di ambiente, aggiungile a /etc/environment file. Dovrai usare sudo per modificare questo file:
sudo gedit /etc/environment

Per aggiungere una variabile d'ambiente, digita il suo nome, un segno di uguale (=) e il valore che si desidera conservare la variabile di ambiente. Non lasciare spazio prima o dopo il segno di uguale (=). Il nome della variabile di ambiente può contenere lettere, un trattino basso (_) o numeri. Tuttavia, il primo carattere di un nome non può essere un numero.
Se ci sono spazi nel valore, assicurarsi di racchiudere l'intero valore tra virgolette (").

Salvare il file, quindi disconnettersi e accedere nuovamente. Uso echo per verificare l'esistenza di una nuova variabile e il valore impostato:
echo $WEBSITE

Perché è una variabile ambientale globale e disponibile a tutti, utenti mary può fare riferimento alla variabile di ambiente al successivo accesso:
echo $WEBSITE

Per visualizzare tutte le variabili di ambiente contemporaneamente, digitare printenv. C'è un sacco di output, quindi ha senso convogliarlo sorte poi in less:
printenv | sort | less

L'elenco ordinato delle variabili di ambiente viene visualizzato per noi in less.

Possiamo convogliare l'output grep per cercare le variabili di ambiente relative a un argomento particolare.
printenv | grep GNOME

RELAZIONATO: Come modificare graficamente i file di testo su Linux con gedit
Variabili di ambiente Shell
Queste sono alcune delle variabili di ambiente di shell utilizzate in bash per dettare o registrare il suo comportamento e funzionalità. Alcuni dei valori vengono aggiornati quando si utilizza il terminale. Ad esempio, il COLUMNS la variabile d'ambiente verrà aggiornata per riflettere le modifiche che potresti apportare alla larghezza della finestra del terminale:
-
BASHOPTS: Le opzioni della riga di comando utilizzate quando
bashè stato lanciato. -
BASH_VERSION: Il
bashnumero di versione come una stringa di parole e numeri. -
BASH_VERSINFO: Il
bashversione come cifra. - COLONNE: La larghezza corrente della finestra del terminale.
-
DIRSTACK: Le directory che sono state aggiunte allo stack di directory dal
pushdcomando. -
HISTFILESIZE: Numero massimo di righe consentito in
historyfile. -
HISTSIZE: Numero di righe di
historyconsentito in memoria. - NOME HOST: Il nome host del computer.
- IFS: Il separatore di campo interno utilizzato per separare l'input dalla riga di comando. Per impostazione predefinita, questo è uno spazio.
-
PS1: Il
PS1la variabile di ambiente contiene la definizione per il prompt dei comandi primario, predefinito e. Un insieme di token chiamati sequenze di escape può essere incluso nella definizione del prompt dei comandi. Rappresentano cose come l'host e il nome utente, la directory di lavoro corrente e l'ora. -
PS2: Quando un comando si estende su più di una riga e sono previsti più input, viene visualizzato il prompt dei comandi secondario. Il
PS2la variabile di ambiente contiene la definizione di questo prompt secondario, che, per impostazione predefinita, è il segno maggiore di (>). -
SHELLOPTS: Opzioni della shell che puoi impostare usando il
setopzione. - UID: L'identificatore utente dell'utente corrente.
RELAZIONATO: Come usare pushd e popd su Linux
Controlliamo alcune di queste variabili della shell:
echo $BASH_VERSION
echo $HOSTNAME
echo $COLUMNS
echo $HISTFILESIZE
echo $UID

Per completezza, ecco i token che è possibile utilizzare nelle definizioni del prompt dei comandi:
- T: L'ora corrente, formattata come HH: MM: SS.
- D: La data corrente, espressa come giorno della settimana, mese, data.
- N: Un personaggio di nuova linea.
- S: Il nome della tua shell.
- W: Il nome della directory di lavoro corrente.
- W: Il percorso della directory di lavoro corrente.
- U: Il nome utente della persona che ha effettuato l'accesso.
- H: Il nome host del computer.
-
#: Ogni comando all'interno di una shell è numerato. Ciò consente di vedere il numero del comando nel prompt dei comandi. Questo non è lo stesso del numero che il comando avrà nel
historyelenco. -
$: Imposta il carattere finale del prompt su un simbolo di dollaro (
$) per un utente normale e un simbolo hash (#) per l'utente root. Funziona controllando l'UID dell'utente. Se è zero, l'utente è root.
Troverai la tua definizione PS1 variabile d'ambiente nel tuo .bashrc file.
Creazione di variabili di ambiente di sessione
Per creare variabili di ambiente per uso personale, aggiungerle in fondo al proprio .bashrc file. Se desideri avere le variabili di ambiente disponibili per le sessioni remote, come le connessioni SSH, dovrai aggiungerle alle tue .bash_profile anche il file.
Il formato della definizione della variabile di ambiente è lo stesso per entrambi i file. Per aggiungere una definizione al tuo .bash_profile file, digita questo nella tua home directory:
gedit .bashrc

Abbiamo aggiunto una variabile di ambiente chiamata INHERITED_VAR. Nota la parola “esportazione” all'inizio della riga.

Salvare e chiudere il file al termine della modifica. È possibile disconnettersi e riconnettersi oppure è possibile far rileggere la shell .bash_profile file utilizzando il comando punto (.) come questo:
. .bashrc

Ora creiamo una variabile d'ambiente dalla riga di comando:
LOCAL_VAR="This session only"

Se usiamo echo, possiamo vedere che entrambe le variabili di ambiente sono accessibili a noi:
echo $LOCAL_VAR
echo $INHERITED_VAR

Noterai la definizione di INHERITED_VAR la variabile d'ambiente aveva la parola “export” all'inizio della riga. Ciò significa che la variabile di ambiente verrà ereditata dai processi figlio della shell corrente. Se ne lanciamo un altro usando il bash comando, possiamo controllare nuovamente le due variabili, dall'interno della shell figlio:
bash
echo $LOCAL_VAR
echo $INHERITED_VAR

Come puoi vedere, il INHERITED_VAR è accessibile nella shell figlio, ma LOCAL_VAR non è. Abbiamo semplicemente una riga vuota.
Sebbene “export” aggiunge la parte della variabile di ambiente all'ambiente che i processi figlio ereditano, INHERITED_VAR non è una variabile d'ambiente globale. Ad esempio, l'utente mary non posso fare riferimento:
echo $INHERITED_VAR

Per chiudere nostro figlio bash sessione, usiamo exit:
exit
Anche gli ambienti ereditati influiscono sugli script. Ecco un semplice script che scrive i valori delle nostre tre variabili di ambiente nella finestra del terminale:
#!/bin/bash echo "WEBSITE" $WEBSITE echo "LOCAL_VAR" $LOCAL_VAR echo "INHERITED_VAR" $INHERITED_VAR
Questo è stato salvato in un file chiamato envtest.she quindi reso eseguibile con il seguente:
chmod +x envtest.sh
Quando eseguiamo lo script, può accedere a due delle tre variabili di ambiente:
./envtest.sh

Lo script può vedere il file WEBSITE variabile d'ambiente globale e INHERITED_VAR variabile d'ambiente esportata. Non può accedere LOCAL_VAR, anche se lo script è in esecuzione nella stessa shell in cui è stata creata la variabile.
Se necessario, possiamo esportare una variabile di ambiente dalla riga di comando. Lo faremo al nostro LOCAL_VAR, quindi eseguire nuovamente lo script:
export LOCAL_VAR
./envtest.sh

La variabile d'ambiente è stata aggiunta all'ambiente della shell corrente e quindi appare nell'ambiente ereditato dallo script. Lo script può fare riferimento anche a quella variabile d'ambiente.
Connessioni remote
Le variabili di ambiente globali sono accessibili alle sessioni di accesso remoto, ma se si desidera che le variabili di ambiente definite localmente siano disponibili da remoto, è necessario aggiungerle al proprio .bash_profile file. È possibile impostare la stessa variabile di ambiente in .bashrc e .bash_profile file, con valori diversi. Questo potrebbe essere raccolto da uno script, per esempio, per modificarne il comportamento per le persone che usano il sistema localmente o da remoto.
(A rischio di confusione, c'è anche un .profile file. Può contenere anche definizioni di variabili di ambiente. comunque, il .profile il file non viene letto se il file .bash_profile il file è presente. Quindi, la cosa più sicura da fare — e il bash-modo conforme — è usare il .bash_profile file.)
Per modificare il .bash_profile file, useremo gedit ancora:
gedit .bash_profile

Aggiungeremo la stessa variabile d'ambiente con lo stesso valore che abbiamo usato in precedenza.

Salva le modifiche e chiudi gedit.
Su un altro computer, faremo un SSH connessione al computer di prova.
ssh dave@howtogeek.local

Una volta connessi, eseguiremo nuovamente lo script:
./envtest.sh

Il .bash_profile il file è stato letto come parte dell'inizializzazione dell'accesso remoto e il file INHERITED_VAR la variabile d'ambiente è accessibile a noi e allo script.
Disinserimento di una variabile di ambiente
Per annullare l'impostazione di una variabile di ambiente, utilizzare il unset comando. Se disinseriamo la variabile d'ambiente globale, WEBSITEe la variabile d'ambiente esportata, INHERITED_VAR, non saranno più disponibili sulla riga di comando, né nei processi figlio:
unset WEBSITE
unset INHERITED_VAR
./envtest.sh
echo $WEBSITE

Un punto da notare è che questo cambia solo la disponibilità delle variabili d'ambiente globali per te in questa sessione. Un'altra persona che ha effettuato l'accesso simultaneamente sarà comunque in grado di accedere alla sua istanza di quella variabile di ambiente globale. La sua istanza è stata inizializzata e letta dal /etc/environment durante la procedura di accesso ed è indipendente dalla copia della variabile di qualcun altro.
Ad esempio, utente mary può ancora accedere a WEBSITE variabile di ambiente e leggere il suo valore, anche se l'utente dave ha unset nella sua sessione:
echo $WEBSITE

Controllo ambientale
Le variabili d'ambiente possono essere utilizzate per far sapere agli script e alle applicazioni come dovrebbero comportarsi. Possono essere utilizzati per memorizzare impostazioni o piccole quantità di dati. Ad esempio, uno script può popolare un ambiente con un valore a cui può fare riferimento altri script senza doverli scrivere su un file.
