Shell bash: i file di configurazione
Indice - Table of Contents
Introduzione
Con il termine shell si indica un programma il quale attraverso un’interfaccia a riga di comando permette di eseguire e/o connettere tra di loro diversi programmi nonché di interagire con il sistema operativo sottostante. Molto semplicemente si digita un comando e, se questo prevede una qualche risposta, l’output viene mostrato sullo schermo. Trattasi della classica modalità con la quale viene utilizzata l’interfaccia a riga di comando in un terminale nota come modalità interattiva. A rigore, in particolar modo oggi con la diffusione delle interfacce grafiche, sarebbe più corretto parlare di emulatore di terminale. Se ne conoscono – e utilizzano – diversi tra i quali ne voglio ricordare qualcuno (elenco non esaustivo): in ambiente KDE il programma Konsole, GNOME Terminal per l’omonimo ambiente del piedone GNOME, xterm e così via a seguire.
Esistono diverse varianti della shell in ambiente Unix-GNU/Linux, tutte derivate dalla storica Bourne shell nota con il nome sh. La più utilizzata, e alla quale si farà riferimento nel seguito, è la shell Bash (Bourne Again Shell). Ma è utile sapere che si possono installare/utilizzare/trovare già installate altre shell come la dash (Debian Almquist shell) a sua volta derivata dalla Ash (Almquist shell). La shell ksh (Korn shell) e dalla quale deriva la zsh (Z shell).
Molte shell tra quelle elencate, e anche tra quelle non riportate, hanno capacità di scripting; in sostanza permettono di creare un programma – ovvio che trattasi di un programma interpretato – che poi verrà eseguito nell’ambiente della shell che lo lancia. Le varie shell, nel linguaggio di scripting che supportano, differiscono nelle varie opzioni che offrono all’utente e in termini di comandi così come nella complessità e capacità del linguaggio di scripting supportato.
La shell di login
Come già ho riportato, nel seguito verrà presa in considerazione solo la shell Bash questo perché è il riferimento del progetto GNU della Free Software Foundation.
La possibilità di utilizzare degli script per creare veri e propri programmi interpretati mette in luce un altro aspetto della shell; l’utilizzo in diversi contesti e diverse modalità. Le due di interesse in questo scenario vedono:
- Shell di login;
- Shell interattiva.
Una shell è di login, come riportato nel manuale (man bash), quando:
A login shell is one whose first character of argument zero is a -, or one started with the --login option.
oppure, in presenza del manuale in Italiano:
Una shell di login è quella in cui il cui primo carattere dell’argomento zero è un -, o una che venga avviata con l’opzione --login.
È il processo di login che “fa sapere” alla shell di comportarsi come una shell di login seguendo la convenzione riportata nel manuale; passare all’argomento 0, che normalmente è il nome dell’eseguibile della shell, il carattere – anteposto allo stesso eseguibile, i.e. -bash.
Affermazione facilmente dimostrabile. Ad esempio effettuando un accesso via SSH (Secure SHell) al server che ospita questo sito, il comando ps -f (man ps) impartito sul server dimostra l’uso di una shell di login. In maniera più estesa se si effettua un login alla shell Bash utilizzando xterm o un emulatore di terminale come PuTTY allora la sessione è contemporaneamente una shell di login e interattiva (leggere oltre). Infatti in entrambe le condizioni se digitiamo bash seguito da Invio entreremo in una shell interattiva che però non sarà una shell di login. Nell’immagine riportata (un click per ingrandirla) il primo comando exit chiuderà la shell Bash interattiva pur rimanendo aperta la shell di login interattiva, il secondo – non visibile poiché non impartito in quello scenario – uscirà dalla sessione SSH. A titolo di completezza anche il comando su – permetterà di ottenere una shell di login interattiva. Quanto riportato a differenza di quando si accede in modalità grafica (su un display manager X), non si ottiene una shell di accesso, ma un gestore di sessioni o un gestore di finestre.
È utile sapere che quando una shell Bash di login è invocata viene configurato il proprio ambiente grazie a specifici file di configurazione, al livello di sistema così come al livello di utente che richiede l’invocazione della suddetta.
In particolare verranno eseguite dapprima tutte le istruzioni contenute nel file /etc/profile il quale, oltremodo, inizia con la seguente raccomandazione (commenti):
# It’s NOT a good idea to change this file unless you know what you
# are doing. It’s much better to create a custom.sh shell script in
# /etc/profile.d/ to make custom changes to your environment, as this
# will prevent the need for merging in future updates.
Ad indicare che eventuali personalizzazioni al livello di sistema è opportuno che vengano riportate in maniera specifica come file nomefile.sh nella cartella /etc/profile.d/. Configurazioni personalizzate della shell di login che sono permesse anche al livello utente attraverso appositi file e nell’ordine riportato nel seguito: ~/.bash_profile, ~/.bash_login e ~/.profile eseguendo i comandi del primo che trova ignorando gli altri. Generalmente il primo della lista è quasi sempre presente e a sua volta richiama alias e funzioni presenti nel file ~/.bashrc questo perché, va ricordato, una shell di login può essere anche una shell interattiva. Infine, una shell di login all’uscita, quindi al logout, legge il file ~/.bash_logout.
Osservare come i suddetti file non abbiano alcuna estensione particolare (e.g. .sh) e come siano dei “comuni” file di testo, questo perché vengono eseguiti sostanzialmente utilizzando il comando interno alla shell source generalmente utilizzato anche per caricare file contenenti funzioni e/o istruzioni nella shell corrente. Ad esempio dal prompt della bash l’uso del seguente comando (i permessi di esecuzione non sono obbligatori) source ~/.bashrc ricarica le impostazioni – eventualmente modificate – per la shell bash attualmente in esecuzione.
NOTA 1: probabilmente è superfluo ricordare che tutti i file e le cartelle i cui nomi iniziano con un punto, in ambiente GNU/Linux-Unix indicano dei file nascosti e pertanto saranno visibili in shell con il comando ls solo utilizzando l’opzione -a. Da interfaccia grafica saranno in maniera predefinita non visibili da un qualsiasi file manager (e.g. Dolphin e simili) a meno di abilitare l’opzione Mostra i file nascosti (la scorciatoia da testiera in genere è Ctrl-H).
NOTA 2: come ricordato source è un comando shell built-in (interno alla shell, come è facile verificare utilizzando il comando type source) che esegue il contenuto del file passato come argomento nella shell corrente. È sinonimo del comando . nomefile. Altrimenti detto impartire source nomefile o . nomefile sortisce il medesimo comportamento e risultato. Prestare attenzione, però, al fatto che ./nomefile e source nomefile invece non sono assolutamente sinonimi. Infatti mentre source nomefile legge ed esegue le istruzioni dal file di testo nell’ambiente corrente della shell (cfr. con il comando help source), il comando ./nomefile avvia una nuova shell per lanciare come file eseguibile quanto presente nel file.
NOTA 3: si ricorda che il simbolo ~ (tilde) in ambiente GNU/Linux sta ad indicare la home utente dell’utente corrente pertanto, ad esempio, il comando cd ~ può essere visto come una “scorciatoia” per indicare cd /home/nome_utente/.
Shell interattiva
Partiamo dalla definizione riportata nel manuale (man bash) in Italiano:
Una shell è detta interattiva se è stata avviata senza argomenti diversi dalle opzioni e senza l’opzione -c i cui standard input e standard error sono entrambi inviati a terminali (come determinato da isatty(3)), o se viene avviata con l’opzione -i. PS1 è impostato e $- include i se bash è interattiva, permettendo a uno script di shell o a un file di inizializzazione di verificare questo stato.
Il primo periodo è piuttosto esplicativo: una shell interattiva è una shell che legge i comandi dal suo standard input (generalmente una tastiera) e visualizza i risultati sullo standard output (generalmente lo schermo). Una shell per essere interattiva non deve essere lanciata con l’opzione -c. È esplicitamente interattiva se viene lanciata con l’opzione -i. Il secondo periodo potrebbe apparire un po’ più criptico.
PS1 è una variabile dell’ambiente shell che ne imposta il prompt ed è personalizzabile. Ad esempio per l’immagine riportata nel paragrafo precedente la variabile PS1 – relativa ad una distribuzione CentOS – è pari a [\u@\h \W]\$. Infatti \u indica lo username dell’utente, \h il nome della stazione/PC (ad esempio nelle distribuzioni in uso desktop generalmente è localhost), \W è il nome della directory di lavoro (pertanto cambia ogni volta che viene utilizzato ad esempio il comando cd) e infine \$ indica un prompt pari a $ per l’utente normale e # per l’amministratore. Per il controllo del prompt esistono altre tre variabili d’ambiente che in questo contesto non interessano ma che comunque, per completezza, si ricordano essere PS2, PS3 e PS4.
Olttre a quelle indicate, che sono solo una minima parte, esistono ulteriori variabili dette variabili speciali e utilizzate dalla shell ad esempio per conoscere il numero di argomenti passati ad uno script, il PID (Process IDentifier), la lista degli argomenti ecc. Una di queste variabili speciali è – ad indicare la lista delle opzioni invocate (e quindi attive) per la shell corrente. Come fare la lettura di questa variabile? Con il comando echo $- il quale potrebbe dare un output del tipo himBHs laddove è visibile l’opzione -i ad indicare una shell interattiva. Una lista completa della configurazione dell’ambiente della shell è possibile visualizzarla con il comando printenv (man printenv).
Un promemoria grafico (flowchart) relativo solo alla shell Bash – non comprendente, ad esempio, shell remote – è visibile nell’immagine che segue.
2 pensieri su “Shell bash: i file di configurazione”