Torna al blog

Come leggere e impostare le variabili d'ambiente e di shell su un VPS Linux

Come leggere e impostare le variabili d'ambiente e di shell su un VPS Linux

La maggior parte della comunità tecnologica ama interagire con i sistemi tramite l'interfaccia a riga di comando (CMD) o la shell. In genere, questo rende il loro lavoro più semplice. Ad esempio, è possibile creare un comando shell in grado di eseguire automaticamente diverse attività, invece di dover fare clic su vari pulsanti di una GUI.

Quando si avvia una shell o un programma CMD, questo compila diverse informazioni. Queste informazioni definiscono il modo in cui il programma accede alle risorse di sistema sottostanti e il suo comportamento generale. È possibile memorizzarle in uno spazio chiamato ambiente. L'ambiente è costituito da stringhe che rappresentano coppie chiave-valore. In questo tutorial utilizzeremo Ubuntu 20.04 VPS come esempio per guidarvi nella configurazione delle variabili d'ambiente o di shell. La guida dovrebbe applicarsi anche ad altre distribuzioni Linux.

Qual è la differenza tra variabili d'ambiente e variabili di shell?

Quando si avvia una sessione, le informazioni vengono raccolte dalle impostazioni e dai file di configurazione del sistema. Successivamente, sono disponibili per il processo di shell e i suoi processi figli. Queste informazioni sono un insieme di coppie chiave-valore in questo formato:

I nomi delle variabili, cioè le chiavi, sono sensibili alle maiuscole e minuscole (case sensitive). Tuttavia, è convenzionalmente accettato scriverli in MAIUSCOLO. Questo aiuta a distinguerli in altri contesti. Con il carattere due punti ‘:’ è possibile assegnare più valori alla stessa variabile. È inoltre importante assicurarsi di non lasciare spazi intorno al carattere =. Le chiavi sono le variabili e si classificano in due tipi: variabili d'ambiente e variabili di shell. Le variabili d'ambiente contengono tutte le variabili definite a livello di sistema e disponibili per ogni shell o processo figlio. Aiutano a passare informazioni ai processi avviati tramite i comandi della shell. Le variabili di shell includono solo le variabili definite nella specifica sessione di shell. Inoltre, includono solo le variabili disponibili esclusivamente all'interno della loro istanza di shell.

Elencare le variabili d'ambiente e di shell

Per impostazione predefinita, il terminale fornisce due comandi per elencare le variabili d'ambiente e di shell: env o printenv. Nel loro stato predefinito mostrano le stesse informazioni. Ecco un esempio di output di questi comandi:

Utilizzo di env:

environment variables Environmental and Shell Variables

Utilizzo di printenv:

printenv

Come si può notare, l'output è lo stesso. La differenza sorge quando si desidera il valore di una chiave specifica. In tal caso si utilizzerà printenv con il nome della variabile:

printenv shell

Per visualizzare più valori, è possibile passare più di un argomento al comando printenv. I valori appariranno nell'ordine in cui sono stati inseriti gli argomenti:

printenv multiple commands

È anche possibile utilizzare il comando echo con il nome della variabile per visualizzarne il valore:

echo variable

Il comando env consente di modificare l'ambiente in cui vengono eseguiti i programmi passando le definizioni delle variabili con una sintassi del tipo:

Questo consente di sovrascrivere i valori o di impostarne di nuovi che possono essere utilizzati dal processo figlio. I comandi printenv ed env elencano le variabili d'ambiente come visto sopra. Queste erano già definite per i processi di sistema. Se si desidera visualizzare un elenco di variabili di shell, è possibile utilizzare il comando set. Digitando set senza alcuna variabile verrà restituito un elenco di tutte le variabili d'ambiente, variabili di shell, variabili locali e funzioni di shell:

set command Environmental and Shell Variables

Le variabili potrebbero essere troppe. Se necessario, è possibile impaginarle utilizzando il comando:

È possibile pulire ulteriormente l'output specificando al comando set di essere eseguito in modalità POSIX, evitando così di stampare le funzioni di shell. Qui lo eseguiamo in una subshell (un'istanza separata del processore dei comandi) per evitare che il comando modifichi l'ambiente corrente:

Quanto sopra elenca tutti i comandi d'ambiente e di shell disponibili sul sistema. È possibile ridurre l'output utilizzando il seguente comando per cercare di ottenere solo le variabili di shell:

Un output di esempio dal comando precedente è:

lists all environmental and shell commands Environmental and Shell Variables

Sebbene il comando possa includere alcune variabili d'ambiente, ti aiuterà a differenziare tra le variabili di shell e quelle d'ambiente. Questo perché il comando set racchiude tra virgolette i valori delle variabili, mentre i comandi printenv ed env non lo fanno. Le variabili di shell sono utili per impostare valori persistenti per le sessioni, senza scrivere in modo permanente le modifiche nei file.

Variabili d'ambiente comuni

USER – L'utente attualmente connesso.
SHELL – La shell che interpreterà i comandi inseriti. Il valore predefinito è bash, ma è possibile modificarlo.
HOME – La directory home dell'utente corrente.
TERM – Specifica il tipo di terminale da emulare. Mostra il terminale attualmente emulato.
PWD – La directory di lavoro corrente.
OLDPWD – La directory di lavoro precedente. Questo aiuta la shell a passare alla directory precedente quando si inserisce il comando di cambio directory come cd.

EDITOR – L'editor di file predefinito quando si digita edit nel terminale.
LS_COLORS – Definisce i codici colore utilizzati per aggiungere un output colorato quando si inserisce il comando ls. Aiuta a differenziare i tipi di file e a fornire informazioni agli utenti.
LOGNAME – Il nome dell'utente corrente.
MAIL – Definisce il percorso della casella di posta dell'utente corrente.
LANG – Definisce l'impostazione locale corrente.
PATH – Specifica un elenco di directory da cercare durante l'esecuzione dei comandi. Durante l'esecuzione di un comando, il sistema effettua una ricerca in queste directory e utilizza il primo eseguibile trovato.
_ – L'ultimo comando eseguito.

Variabili di shell comuni:

BASH_VERSION – La versione di bash, in un formato leggibile dall'uomo.
BASH_VERSINFO – La versione di bash, in un formato leggibile dalla macchina.
BASHOPTS – L'elenco delle opzioni utilizzate all'esecuzione di bash. Utile per determinare se l'ambiente di shell funzionerà come previsto.

COLUMNS – Il numero di colonne di larghezza utilizzate per mostrare l'output sullo schermo.
DIRSTACK – Lo stack di directory disponibili con i comandi pushd e popd.
HOSTNAME – L'hostname del computer in questo momento.
HISTFILESIZE – Numero di righe della cronologia dei comandi memorizzate in un file.
HISTSIZE – Numero di righe della cronologia dei comandi consentite in memoria.
IFS – Il separatore di campo interno per separare l'input sulla riga di comando. Per impostazione predefinita è uno spazio.
SHELLOPTS-Utilizzato per impostare le opzioni della shell.
UID-L'UID dell'utente corrente.
PS1– La definizione del prompt dei comandi principale. Viene utilizzato per definire l'aspetto del prompt all'avvio di una sessione di shell.
PS2 – Dichiara prompt secondari per quando un comando si estende su più righe.

Impostazione di comandi d'ambiente e di shell

In primo luogo, come spiegato in precedenza, manterremo i nomi delle variabili interamente in maiuscolo. Successivamente, vedremo come creare variabili di shell. Infine, creeremo variabili d'ambiente.

Creazione di variabili di shell

Iniziamo con il solito hello world. Inserisci quanto segue nel tuo terminale:

Le virgolette vengono utilizzate perché la variabile contiene uno spazio. Nota che abbiamo usato un apice singolo perché il punto esclamativo è un carattere speciale e dovrebbe essere preceduto da un carattere di escape o inserito tra apici singoli. Ora hai creato la tua prima variabile di shell. È disponibile solo nella sessione di shell corrente. Le variabili di shell non sono disponibili per le shell e i processi figli. Puoi stamparla sul terminale usando il comando set con grep:

print variable

Oppure visualizza il valore usando echo, facendovi riferimento tramite il simbolo $ e il nome della variabile:

echo variable

Se provi a stampare usando printenv, non mostrerà alcun output. Questo ti aiuta a confermare che non si tratta di una variabile d'ambiente:

printenv variable

Creazione di variabili d'ambiente

La variabile di shell creata in precedenza può essere trasformata in una variabile d'ambiente usando il comando export. Per prima cosa, crei una variabile di shell. Poi, per creare una variabile d'ambiente, devi usare il comando export. Dopo aver eseguito questo comando, la variabile sarà disponibile per le shell e i processi figli:

Ora, se esegui un test usando il comando printenv, dovresti vedere la variabile e il valore:

printenv variable value

Puoi anche creare una variabile d'ambiente in un solo passaggio usando la sintassi:

Le variabili d'ambiente vengono passate solo alle shell figlie e non a quella genitore. Questo aiuta a evitare che i processi figli influenzino l'ambiente del programma che li ha chiamati.

Declassamento e annullamento delle variabili

Se hai seguito il tutorial fino a questo momento, hai ancora MY_FIRST_VAR definita come variabile d'ambiente. Puoi trasformarla nuovamente in un comando di shell digitando il comando echo con il flag –n:

Se verifichi con printenv, non ci sarà alcun output. Tuttavia, il comando echo la mostrerà perché è ancora un comando di shell:

echo vs prinenv command

Puoi annullare sia una variabile di shell che una variabile d'ambiente usando il comando unset. E puoi confermare che non esiste più usando echo. Come puoi vedere, non mostra alcun output:

unset variable Environmental and Shell Variables

Impostazione delle variabili d'ambiente al login

Molti programmi dipendono dalle variabili d'ambiente per l'esecuzione. Poiché non è efficiente impostare le variabili ogni volta che si desidera eseguire un programma, Linux fornisce un modo per definirle e salvarle in un file. In questo modo, possono essere impostate automaticamente al momento del login. La shell legge diversi file di configurazione a seconda di come viene avviata la sessione. Questi sono discussi di seguito:

Tipi di sessioni di shell e loro differenze

  • Sessione di shell di login – inizia autenticando l'utente. La sessione viene impostata quando si accede tramite SSH o sessione di terminale.
  • Sessione di shell non di login – inizia quando si avvia una nuova shell dall'interno della shell autenticata. È possibile avviare una nuova shell usando il comando bash. Non sono richiesti dettagli di autenticazione.
  • Sessione di shell interattiva – una sessione di shell associata a una sessione di terminale.
  • Sessione di shell non interattiva – una sessione di shell non associata a una sessione di terminale – viene eseguita in background.

Una sessione è classificata come login o non-login, e come interattiva o non interattiva. Quando si effettua il login e si avvia una sessione di shell tramite SSH, questa sarà una sessione di shell di login e interattiva. Quando si esegue uno script sul terminale, di solito viene eseguito in una sessione non-login e non interattiva. Una sessione di shell può anche essere una combinazione delle due. Quindi, quale file di configurazione viene scelto?

Una sessione di login legge prima i file di configurazione dalla directory /etc/profile. In secondo luogo, controlla i file di configurazione specifici dell'utente dalla directory home dell'utente. Viene letto solo il primo file trovato tra ~/.bash_profile, ~/.bash_login e ~/.profile, mentre tutti gli altri file vengono ignorati. Una sessione non-login leggerà prima da /etc/bash.bashrc, seguito da ~/.bashrc. Le sessioni non interattive leggono la variabile d'ambiente chiamata BASH_ENV per ottenere il nome del file da utilizzare per definire il nuovo ambiente.

Implementazione delle variabili d'ambiente

Quando imposti le tue variabili, tieni sempre presente in quale file le inserisci in base alla nostra discussione precedente. Ciò fornirà flessibilità garantendo che determinate variabili siano disponibili solo in determinate sessioni. Non vorrai che una variabile cruciale manchi in una sessione.

In some casi, vogliamo che la variabile esista sia nelle sessioni di login che in quelle non-login. Fortunatamente, la maggior parte delle distribuzioni Linux, per impostazione predefinita, ha configurato le configurazioni di login per leggere le configurazioni non-login e renderle disponibili per i tuoi processi. Pertanto, puoi semplicemente definire le tue variabili nei file di configurazione non-login. Di solito, impostiamo variabili d'ambiente specifiche per l'utente e vogliamo che le nostre impostazioni siano disponibili sia nelle sessioni di shell di login che in quelle non-login. Per questo motivo, useremo il file ~/.bashrc. Useremo nano per modificare il file. Inserisci quanto segue nel tuo terminale per aprire il file:

Nel file di configurazione aperto, puoi già vedere diverse variabili. Puoi aggiungere variabili d'ambiente nello stesso modo in cui fai quando usi la riga di comando. Digita semplicemente il comando:

Puoi aggiungerle in qualsiasi punto del file, su una nuova riga e non all'interno di una funzione di ciclo. Quindi, salva e chiudi il file. Qualsiasi sessione di shell successiva che avvierai leggerà dal file. Se vuoi che la shell corrente legga le impostazioni che hai appena aggiunto senza doverla riavviare, puoi usare il comando:

Dovresti aggiungere le variabili d'ambiente a livello di sistema in uno dei seguenti file: /etc/profile, /etc/bash.bashrc o /etc/environment.

In sintesi

Infine,  ora puoi impostare le variabili di shell e d'ambiente e goderti la grande potenza che questi strumenti offrono al tuo VPS! Presenta molti vantaggi, come l'automazione dell'esecuzione di alcuni processi, o la configurazione del deployment automatico che richiede informazioni di autenticazione, il passaggio di variabili ai processi figli e altro ancora. Le variabili d'ambiente ti aiutano a nascondere dati sensibili come le informazioni di autenticazione dai repository pubblici, tra gli altri dati. Con queste basi, puoi creare script complessi da eseguire automaticamente tramite la riga di comando senza richiedere il costante intervento dell'utente.

Buon calcolo!

author

Akshay Nagpal

Autore · CloudSigma

Preslav Dobrev è un designer creativo presso CloudSigma, con un focus su un'identità aziendale coerente attraverso l'uso di canali di marketing tradizionali e innovativi. È abile nel fondere la visione artistica con il marketing strategico per creare narrazioni di brand di grande impatto.

Commenti

Ancora nessun commento. Scrivi il primo.