Come impostare le variabili d’ambiente in Bash su Linux

  • Dave McKay

    @TheGurkha

  • April 28, 2020, 8:00am EDT
Un terminale Linux stilizzato con linee di testo verde su un portatile.
fatmawati achmad zaenuri/

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.

Pubblicità

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 mailsistema è 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

Pubblicità

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

echo $SHELL in una finestra di terminale

Per creare le proprie variabili di ambiente globali, aggiungetele al file /etc/environment. Dovrete usare sudo per modificare questo file:

sudo gedit /etc/environment

sudo gedit /etc/environment in una finestra di terminale

Pubblicità

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 (").

Il file /etc/environment aperto in un editor e una nuova variabile d'ambiente aggiunta. Usa per verificare che la nuova variabile esista e mantenga il valore che hai impostato:

echo $WEBSITE

echo $WEBSITE in una finestra del terminale.

Perché è una variabile ambientale globale, e disponibile a tutti, l’utente mary può fare riferimento alla variabile ambientale al suo prossimo login:

echo $WEBSITE

echo $WEBSITE in una finestra di terminale.

Pubblicità

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

printenv | sort | less in una finestra di terminale.

L’elenco ordinato delle variabili d’ambiente viene visualizzato per noi in less.

l'elenco ordinato delle variabili d'ambiente in less in una finestra del terminale.

Possiamo convogliare l’output attraverso grep per cercare le variabili d’ambiente relative a un particolare argomento.

printenv | grep GNOME

printenv | grep GNOME in una finestra di terminale.

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

echo $BASH_VERSION in una finestra di terminale.

Pubblicità

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

.bashrc file loda in un editor e una nuova variabile d'ambiente aggiunta come ultima riga del file.

Pubblicità

Abbiamo aggiunto una variabile d’ambiente chiamata INHERITED_VAR. Nota la parola “export” all’inizio della linea.

gedit .bashrc in una finestra di terminale.

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

. .bashrc in una finestra di terminale.

Ora, creiamo una variabile d’ambiente sulla linea di comando:

LOCAL_VAR="This session only"

LOCAL_VAL="Solo questa sessione" in una finestra di terminale."This session only" in a terminal window.

Se usiamo echo, possiamo vedere che entrambe le variabili d’ambiente sono accessibili a noi:

echo $LOCAL_VAR
echo $INHERITED_VAR

echo $LOCAL_VAR in una finestra terminale.

Pubblicità

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

bash in una finestra di terminale

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

echo $INHERITED_VAR in una finestra del terminale.

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
Pubblicità

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

./envtest.sh in una finestra di terminale.

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

esportare LOCAL_VAR in una finestra di terminale.

Pubblicità

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

gedit .bash_profile in una finestra di terminale.

Aggiungeremo la stessa variabile d’ambiente con lo stesso valore che abbiamo usato prima.

Il file .bash_profile aperto in un editor con una nuova variabile d'ambiente aggiunta.

Salvare le modifiche e chiudere gedit.

Pubblicità

Su un altro computer, faremo una connessione SSH al computer di prova.

ssh [email protected]

ssh dave@howtogeek.local in una finestra di terminale.

Una volta connessi, eseguiremo lo script ancora una volta:

./envtest.sh

./Il file è 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

Unsetting di una variabile di ambiente su Bash su Linux.

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.

Pubblicità

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

echo %WEBSITE in una finestra di terminale.

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
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 ”

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *