- Dave McKay
@TheGurkha
- April 28, 2020, 8:00am EDT
C’è più di un tipo di variabile d’ambiente su Linux. Impara come vederle, crearle per i login locali e remoti, e farle sopravvivere ai riavvii.
Come funzionano le variabili d’ambiente
Quando lanci una finestra di terminale e la shell al suo interno, un insieme di variabili viene referenziato per assicurare che la shell sia configurata correttamente. Queste variabili assicurano anche che qualsiasi informazione a cui la finestra del terminale e la shell potrebbero aver bisogno di fare riferimento sia disponibile. Collettivamente, queste variabili contengono le impostazioni che definiscono l’ambiente che si trova all’interno della finestra del terminale, fino all’aspetto del prompt dei comandi. Quindi, naturalmente, ci si riferisce a loro come variabili d’ambiente.
Alcune variabili d’ambiente sono a livello di sistema, o globali. Altre sono di sessione e possono essere viste solo da voi. Altre non possono fare riferimento alle tue variabili d’ambiente di sessione. C’è un terzo gruppo di variabili d’ambiente definite all’interno della shell. Il tuo locale, il fuso orario e le impostazioni della tastiera, l’insieme di directory ricercate quando la shell cerca di trovare un comando, e il tuo editor predefinito, sono tutti memorizzati nelle variabili d’ambiente della shell.
Vi mostreremo come vedere le variabili d’ambiente che esistono sul vostro sistema, e descriveremo come creare le vostre. Vi mostreremo anche come renderle disponibili ai processi figli e come essere persistenti attraverso i riavvii.
Ambienti ed ereditarietà
Quando una shell inizia, passa attraverso una fase di inizializzazione. È a questo punto che legge le variabili d’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 padre, ma attenzione! Come vedremo, è possibile creare variabili che non vengono aggiunte al vostro ambiente, in modo che non vengano ereditate da un processo figlio.
Se il processo figlio è una shell, quella shell si inizializzerà dal proprio, fresco, set di variabili. Quindi, se si altera il prompt dei comandi nella shell corrente, e poi si lancia una shell figlia, la shell figlia non erediterà il prompt dei comandi modificato del genitore.
Variabili d’ambiente globali
Per convenzione, le variabili d’ambiente hanno nomi maiuscoli. Ecco alcune delle variabili d’ambiente globali e cosa rappresentano i valori che contengono:
- SHELL: Il nome della shell che verrà lanciata quando si apre una finestra del terminale. Sulla maggior parte delle distribuzioni Linux, questo sarà bash, a meno che tu non l’abbia cambiato da quello di default.
- TERM: Le finestre di terminale sono in realtà emulazioni di un terminale hardware. Questo contiene il tipo di terminale hardware che verrà emulato.
- USER: Il nome utente della persona che sta usando il sistema.
- PWD: Il percorso della directory di lavoro corrente.
- OLDPWD: La directory in cui si trovava prima di spostarsi nella directory di lavoro corrente.
- LS_COLORS: L’elenco dei codici colore usati dal
ls
per evidenziare i diversi tipi di file. - MAIL: Se il
mail
sistema è stato impostato sul vostro computer Linux (di default, non lo è), questo conterrà il percorso della casella di posta dell’utente corrente. - PATH: Una lista di directory che la shell cercherà per trovare gli eseguibili dei comandi.
- LANG: Le impostazioni di lingua, localizzazione e codifica dei caratteri.
- HOME: La directory home dell’utente corrente.
- _: La variabile d’ambiente underscore (
_
) contiene l’ultimo comando digitato.
RELATO: Come usare pushd e popd su Linux
Possiamo vedere a cosa sono impostati alcuni di questi utilizzando niente di più sofisticato di echo
, che scriverà i valori nella finestra del terminale. Per vedere il valore tenuto da una variabile d’ambiente, è necessario aggiungere un segno di dollaro ($
) all’inizio del suo nome.
Un tocco di classe è che è possibile utilizzare il completamento della scheda per riempire il nome della variabile d’ambiente per voi. Digitate alcune lettere del nome e premete Tab. Il nome della variabile viene completato dalla shell. Se questo non accade, dovrete digitare qualche altra lettera per distinguere la variabile d’ambiente da altri comandi con nomi che iniziano con le stesse lettere:
echo $SHELL
echo $LANG
echo $HOME
echo $PWD
Per creare le proprie variabili di ambiente globali, aggiungetele al file /etc/environment
. Dovrete usare sudo
per modificare questo file:
sudo gedit /etc/environment
Per aggiungere una variabile di ambiente, scrivi il suo nome, un segno di uguale (=
), e il valore che vuoi che la variabile d’ambiente contenga. Non inserire spazi prima o dopo il segno di uguale (=
). Il nome della variabile d’ambiente può contenere lettere, un underscore (_
), o numeri. Tuttavia, il primo carattere di un nome non può essere un numero.
Se ci sono spazi nel valore, assicuratevi di racchiudere l’intero valore tra virgolette ("
).
per verificare che la nuova variabile esista e mantenga il valore che hai impostato:
echo $WEBSITE
Perché è una variabile ambientale globale, e disponibile a tutti, l’utente mary
può fare riferimento alla variabile ambientale al suo prossimo login:
echo $WEBSITE
Per vedere tutte le variabili d’ambiente in una volta, digitate printenv
. C’è molto output, quindi ha senso convogliarlo attraverso sort
, e poi in less
:
printenv | sort | less
L’elenco ordinato delle variabili d’ambiente viene visualizzato per noi in less
.
Possiamo convogliare l’output attraverso grep
per cercare le variabili d’ambiente relative a un particolare argomento.
printenv | grep GNOME
RELATO: Come modificare i file di testo graficamente su Linux con gedit
Variabili d’ambiente della shell
Queste sono alcune delle variabili d’ambiente della shell utilizzate in bash
per dettare o registrare il suo comportamento e funzionalità. Alcuni dei valori sono aggiornati man mano che si usa il terminale. Per esempio, la variabile d’ambiente COLUMNS
sarà aggiornata per riflettere i cambiamenti che si potrebbero fare alla larghezza della finestra del terminale:
- BASHOPTS: Le opzioni della linea di comando che sono state usate quando
bash
è stato lanciato. - BASH_VERSION: Il numero di versione
bash
come una stringa di parole e numeri. - BASH_VERSINFO: La
bash
versione come cifra. - COLUMNS: La larghezza attuale della finestra del terminale.
- DIRSTACK: Le directory che sono state aggiunte allo stack delle directory dal comando
pushd
. - HISTFILESIZE: Numero massimo di linee consentite nel file
history
. - HISTSIZE: Numero di linee di
history
consentite in memoria. - HOSTNAME: L’hostname del computer.
- IFS: Il separatore di campo interno usato per separare l’input sulla linea di comando. Per impostazione predefinita, è uno spazio.
- PS1: La variabile d’ambiente
PS1
contiene la definizione per il prompt primario, predefinito e di comando. Un insieme di token chiamati sequenze di escape può essere incluso nella definizione del vostro prompt dei comandi. Essi 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 linea e ci si aspetta più input, viene mostrato il prompt dei comandi secondario. La variabile d’ambiente
PS2
contiene la definizione di questo prompt secondario, che, per impostazione predefinita, è il segno maggiore di (>
). - SHELLOPTS: Opzioni della shell che potete impostare usando l’opzione
set
. - UID: L’identificatore dell’utente corrente.
RELATO: Come usare pushd e popd su Linux
Controlliamo alcune di queste variabili di shell:
echo $BASH_VERSION
echo $HOSTNAME
echo $COLUMNS
echo $HISTFILESIZE
echo $UID
Per completezza, ecco i token che puoi usare 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 carattere di nuova riga.
- \s: Il nome della tua shell.
- \W: Il nome della tua directory di lavoro corrente.
- \w: Il percorso della tua directory di lavoro corrente.
- \u: Il nome utente della persona che ha effettuato l’accesso.
- \h: L’hostname del computer.
- \#: Ogni comando all’interno di una shell è numerato. Questo ti permette di vedere il numero del comando nel tuo prompt dei comandi. Questo non è lo stesso numero che il comando avrà nella
history
lista. - \$: Imposta il carattere finale del prompt in un segno di dollaro (
$
) per un utente normale, e un simbolo di hash (#
) per l’utente root. Questo funziona controllando l’UID dell’utente. Se è zero, l’utente è root.
Troverai la definizione della tua variabile d’ambiente PS1
nel tuo file .bashrc
.
Creazione di variabili d’ambiente di sessione
Per creare variabili d’ambiente per uso personale, aggiungile alla fine del tuo file .bashrc
. Se si vuole che le variabili d’ambiente siano disponibili per le sessioni remote, come le connessioni SSH, è necessario aggiungerle al proprio file .bash_profile
.
Il formato della definizione delle variabili d’ambiente è lo stesso per entrambi i file. Per aggiungere una definizione al vostro file .bash_profile
, digitate questo nella vostra home directory:
gedit .bashrc
Abbiamo aggiunto una variabile d’ambiente chiamata INHERITED_VAR
. Nota la parola “export” all’inizio della linea.
Salva e chiudi il tuo file dopo aver finito le modifiche. Potresti fare il logout e rientrare di nuovo, oppure puoi fare in modo che la shell rilegga il file .bash_profile
usando il comando dot (.
) come questo:
. .bashrc
Ora, creiamo una variabile d’ambiente sulla linea di comando:
LOCAL_VAR="This session only"
Se usiamo echo
, possiamo vedere che entrambe le variabili d’ambiente sono accessibili a noi:
echo $LOCAL_VAR
echo $INHERITED_VAR
Si noterà che la definizione della variabile d’ambiente INHERITED_VAR
ha la parola “export” all’inizio della linea. Questo significa che la variabile d’ambiente sarà ereditata dai processi figli della shell corrente. Se ne lanciamo un altro usando il comando bash
, possiamo controllare nuovamente le due variabili, dall’interno della shell figlia:
bash
echo $LOCAL_VAR
echo $INHERITED_VAR
Come potete vedere, il INHERITED_VAR
è accessibile nella shell figlio, ma LOCAL_VAR
non lo è. Otteniamo semplicemente una riga vuota.
Anche se “export” aggiunge la parte di variabile d’ambiente all’ambiente che i processi figli ereditano, INHERITED_VAR
non è una variabile d’ambiente globale. Per esempio, l’utente mary
non può farne riferimento:
echo $INHERITED_VAR
Per chiudere la nostra sessione bash
figlia, usiamo exit
:
exit
Anche gli ambienti ereditati influenzano gli 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.sh
, e poi 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 la WEBSITE
variabile d’ambiente globale e la INHERITED_VAR
variabile d’ambiente esportata. Non può accedere a LOCAL_VAR
, anche se lo script è in esecuzione nella stessa shell dove la variabile è stata creata.
Se abbiamo bisogno, possiamo esportare una variabile d’ambiente dalla linea di comando. Lo faremo nel nostro LOCAL_VAR
, e poi eseguiremo 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. Anche lo script può fare riferimento a quella variabile d’ambiente.
Connessioni remote
Le variabili d’ambiente globali sono accessibili alle sessioni di login remote, ma se vuoi che le tue variabili d’ambiente definite localmente siano disponibili da remoto, devi aggiungerle al tuo file .bash_profile
. Puoi impostare la stessa variabile d’ambiente nei file .bashrc
e .bash_profile
, con valori diversi. Questo potrebbe essere raccolto da uno script, ad esempio, per modificare il suo comportamento per le persone che usano il sistema in locale o in remoto.
(A rischio di confondere le cose, c’è anche un file .profile
. Anch’esso può contenere definizioni di variabili d’ambiente. Tuttavia, il file .profile
non viene letto se il file .bash_profile
è presente. Quindi, la cosa più sicura da fare – e il modo bash
compatibile – è usare il file .bash_profile
.)
Per modificare il file .bash_profile
, useremo di nuovo gedit
:
gedit .bash_profile
Aggiungeremo la stessa variabile d’ambiente con lo stesso valore che abbiamo usato prima.
Salvare le modifiche e chiudere gedit
.
Su un altro computer, faremo una connessione SSH
al computer di prova.
ssh [email protected]
Una volta connessi, eseguiremo lo script ancora una volta:
./envtest.sh
è stato letto come parte dell’inizializzazione del login remoto, e la variabile d’ambiente INHERITED_VAR
è accessibile a noi e allo script.
Non impostare una variabile d’ambiente
Per disimpostare una variabile d’ambiente usare il comando unset
. Se deselezioniamo la variabile d’ambiente globale, WEBSITE
, e la variabile d’ambiente esportata, INHERITED_VAR
, non saranno più disponibili sulla linea di comando, né nei processi figli:
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 voi in questa sessione. Un’altra persona che è loggata simultaneamente sarà ancora in grado di accedere alla sua istanza di quella variabile d’ambiente globale. La sua istanza è stata inizializzata e letta dal file /etc/environment
durante il suo processo di login, ed è indipendente dalla copia della variabile di chiunque altro.
Come esempio, l’utente mary
può ancora accedere alla variabile d’ambiente WEBSITE
e leggere il suo valore, anche se l’utente dave
ha unset
nella sua sessione:
echo $WEBSITE
Controllo ambientale
Le variabili ambientali possono essere usate per far sapere agli script e alle applicazioni come devono comportarsi. Possono essere usate per memorizzare impostazioni o piccole quantità di dati. Per esempio, uno script può popolare un ambiente con un valore che può essere referenziato da altri script senza doverlo scrivere in un file.
Dave McKay ha usato i computer per la prima volta quando il nastro di carta perforato era in voga, e da allora ha sempre programmato. Dopo oltre 30 anni nell’industria IT, ora è un giornalista tecnologico a tempo pieno. Durante la sua carriera, ha lavorato come programmatore freelance, come manager di un team internazionale di sviluppo software, come project manager di servizi IT e, più recentemente, come Data Protection Officer. Dave è un evangelista di Linux e un sostenitore dell’open source.Read Full Bio ”