Per anni la shell Bash [1] è stato parte integrante di molte distribuzioni Linux. All’inizio, Bash è stata scelta come shell GNU ufficiale perché era ben nota, abbastanza stabile e offriva un discreto insieme di funzionalità.
Oggi la situazione è leggermente diversa: Bash è ancora presente ovunque come pacchetto software ma è stato sostituito da alternative nell’installazione standard. Questi includono, ad esempio, la shell Debian Almquist (Dash) [2] (per Debian GNU / Linux) o Zsh [3] (per GRML [5]). Nelle ben note distribuzioni Ubuntu, Fedora, Arch Linux e Linux Mint, Bash è rimasta finora la shell standard.
È molto utile comprendere l’avvio di Bash e sapere come configurarlo correttamente. Ciò include la personalizzazione del proprio ambiente di shell, ad esempio, l’impostazione della variabile $ PATH, la regolazione dell’aspetto del prompt della shell e la creazione di alias. Inoltre, daremo uno sguardo ai due file .bashrc e .bash_profile che vengono letti all’avvio. La conoscenza corrispondente viene verificata nell’esame 1 della certificazione Linux Professional Institute [4].
Confronto tra un accesso interattivo e una shell batch non interattiva
Indice Articolo
In generale, una shell ha due modalità di funzionamento. Può essere eseguito come shell di login interattiva e come shell batch non interattiva. La modalità di funzionamento definisce l’avvio di Bash e quali file di configurazione vengono letti [7]. La modalità di funzionamento può essere differenziata come segue [6] – shell di login interattiva, shell non di login interattiva, shell di login non interattiva e shell non di login non interattiva (batch).
Per dirla semplicemente, una shell interattiva legge e scrive sul terminale di un utente. Al contrario, una shell non interattiva non è associata a un terminale, come quando si esegue uno script di shell batch. Una shell interattiva può essere una shell di login o non di login.
Shell di accesso interattivo
Questa modalità si riferisce all’accesso al computer su una macchina locale utilizzando un terminale che va da tty1 a tty4 (dipende dall’installazione – potrebbero esserci più o meno terminali). Inoltre, questa modalità copre l’accesso remoto a un computer, ad esempio, tramite Secure Shell (ssh) come segue:
$ ssh utente@comando a distanza del sistema remoto
Il primo comando si connette al sistema remoto e apre solo una shell interattiva. Al contrario, il secondo comando si connette al sistema remoto, esegue il comando dato in una shell di login non interattiva e termina la connessione ssh. L’esempio seguente mostra questo in modo più dettagliato:
utente@localhostla password di:
11:58:49 fino a 23 giorni, 11:41, 6 utenti, media di caricamento: 0,10, 0,14, 0,20
$
Per scoprire se hai effettuato l’accesso al tuo computer utilizzando una shell di login, digita il seguente comando echo nel tuo terminale:
Per una shell di login, l’output inizia con un “-” seguito dal nome della shell, che nel nostro caso risulta “-bash”. Per una shell non di login, l’output è solo il nome della shell. L’esempio seguente mostra questo per i due comandi echo $ 0 e il tempo di attività viene assegnato a ssh come parametro di stringa:
utente@localhostla password di:
bash
11:58:49 fino a 23 giorni, 11:41, 6 utenti, media di caricamento: 0,10, 0,14, 0,20
$
In alternativa, usa il comando shopt integrato [8] come segue:
login_shell off
$
Per una shell non di login, il comando restituisce “off” e per una shell di login “on”.
Per quanto riguarda la configurazione per questo tipo di shell, vengono presi in considerazione tre file. Questi sono / etc / profile, ~ / .profile e ~ / .bash_profile. Vedi sotto per una descrizione dettagliata di questi file.
Shell interattiva non di accesso
Questa modalità descrive l’apertura di un nuovo terminale, ad esempio xterm o Gnome Terminal, e l’esecuzione di una shell al suo interno. In questa modalità, vengono letti i due file / etc / bashrc e ~ / .bashrc. Vedi sotto per una descrizione dettagliata di questi file.
Shell non interattiva non di accesso
Questa modalità è in uso quando si esegue uno script di shell. Lo script della shell viene eseguito nella propria sottoshell. È classificato come non interattivo a meno che non richieda l’input dell’utente. La shell si apre solo per eseguire lo script e la chiude immediatamente una volta terminato lo script.
Shell di accesso non interattiva
Questa modalità copre l’accesso a un computer da remoto, ad esempio tramite Secure Shell (ssh). Lo script di shell local-script.sh viene eseguito localmente, per primo, e il suo output viene utilizzato come input di ssh.
./local-script.sh | ssh utente@sistema remoto
L’avvio di ssh senza ulteriori comandi avvia una shell di login sul sistema remoto. Nel caso in cui il dispositivo di input (stdin) di ssh non sia terminale, ssh avvia una shell non interattiva e interpreta l’output dello script come comandi da eseguire sul sistema remoto. L’esempio seguente esegue il comando uptime sul sistema remoto:
Lo pseudo-terminale non verrà allocato perché stdin non è un terminale.
Franco@localhostla password di:
I programmi inclusi con il sistema Debian GNU / Linux sono software libero;
i termini esatti di distribuzione per ogni programma sono descritti nel
singoli file in / usr / share / doc / * / copyright.
Debian GNU / Linux viene fornita ASSOLUTAMENTE NESSUNA GARANZIA, nella misura in cui
consentito dalla legge applicabile.
Hai nuova posta.
11:58:49 fino a 23 giorni, 11:41, 6 utenti, media di caricamento: 0,10, 0,14, 0,20
$
È interessante notare che ssh si lamenta del fatto che stdin non sia un terminale e mostra il messaggio del giorno (motd) che è memorizzato nel file di configurazione globale / etc / motd. Per accorciare l’output del terminale, aggiungere l’opzione “sh” come parametro del comando ssh, come mostrato di seguito. Il risultato è che una shell viene aperta per prima ei due comandi vengono eseguiti senza visualizzare prima il motd.
Franco@localhostla password di:
12:03:39 su 23 giorni, 11:46, 6 utenti, media di caricamento: 0,07, 0,09, 0,16
$$
Successivamente, daremo uno sguardo ai diversi file di configurazione per Bash.
File di avvio Bash
Le diverse modalità Bash definiscono quali file di configurazione vengono letti all’avvio:
- shell di login interattiva
- / etc / profile: se esiste, esegue i comandi elencati nel file.
- ~ / .bash_profile, ~ / .bash_login e ~ / .profile (in quest’ordine). Esegue i comandi dal primo file leggibile trovato dalla lista. Ogni singolo utente può avere il proprio set di questi file.
- shell interattiva non di login
- /etc/bash.bashrc: configurazione Bash globale. Esegue i comandi se quel file esiste ed è leggibile. Disponibile solo in Debian GNU / Linux, Ubuntu e Arch Linux.
- ~ / .bashrc: configurazione Bash locale. Esegue i comandi se quel file esiste ed è leggibile.
Potrebbe essere utile vederlo come un grafico. Durante la ricerca, abbiamo trovato l’immagine qui sotto, che ci piace molto [9].
Immagine: config-path.png
testo: Processo di valutazione per la configurazione Bash
Spiegazione dei diversi file di configurazione
Per i file spiegati di seguito, non esiste un set di regole generali su quale opzione memorizzare in quale file (ad eccezione delle opzioni globali rispetto alle opzioni locali). Inoltre, l’ordine in cui vengono letti i file di configurazione è progettato tenendo presente la flessibilità in modo che una modifica della shell che si utilizza assicuri che sia ancora possibile utilizzare il sistema Linux. Ecco perché sono in uso diversi file che configurano la stessa cosa.
/ etc / profile
Questo file viene utilizzato dalla shell Bourne (sh) e dalle shell compatibili Bourne come Bash, Ash e Ksh. Contiene le voci predefinite per le variabili di ambiente per tutti gli utenti che accedono in modo interattivo. Ad esempio, questo influenza il $ PATH e il design del prompt per gli utenti regolari, nonché per l’utente denominato “root”. L’esempio seguente mostra una parte di / etc / profile da Debian GNU / Linux.
# Directory comuni agli eseguibili per tutti gli utenti
SENTIERO=“/ usr / local / bin: / usr / bin: / bin”
# Test per l’utente root da aggiungere per i programmi di amministrazione del sistema
Se [ “`id -u`“ -eq 0 ]; poi
SENTIERO=“/ usr / local / sbin: / usr / sbin: / sbin:$ PATH“
altro
SENTIERO=“/ usr / local / games: / usr / games:$ PATH“
essere
esportare SENTIERO
}
setuserpath()
# PS1 è la stringa del prompt dei comandi principale
Se [ “$PS1“ ]; poi
Se [ “$BASH“ ] && [ “$BASH“ != “/bin/sh” ]; poi
# Il file bash.bashrc imposta già la PS1 predefinita.
# PS1 = ‘ h: w $’
Se [ -f /etc/bash.bashrc ]; poi
. /eccetera/bash.bashrc
essere
altro
Se [ “`id -u`“ -eq 0 ]; poi
PS1=“#”
altro
PS1=“$”
essere
essere
essere
Ulteriori file di configurazione possono essere salvati nella directory /etc/profile.d. Vengono inseriti nella configurazione Bash non appena / etc / profile viene letto.
~ / .bash_profile
Questo file di configurazione locale viene letto ed eseguito quando Bash viene invocato come una shell di login interattiva. Contiene comandi che dovrebbero essere eseguiti una sola volta, come la personalizzazione della variabile d’ambiente $ PATH.
È abbastanza comune riempire ~ / .bash_profile solo con righe come sotto l’origine del file .bashrc. Ciò significa che ogni volta che accedi al terminale, viene letto il contenuto della tua configurazione Bash locale.
. ~/.bashrc
essere
Se il file ~ / .bash_profile esiste, Bash salterà la lettura da ~ / .bash_login (o ~ / .profile).
~ / .bash_login
I due file ~ / .bash_profile e ~ / .bash_login sono analoghi.
~ / .profile
La maggior parte delle distribuzioni Linux utilizza questo file invece di ~ / .bash_profile. Viene utilizzato per individuare il file locale .bashrc e per estendere la variabile $ PATH.
Se [ -n “$BASH_VERSION“ ]; poi
# includi .bashrc se esiste
Se [ -f “$HOME/.bashrc” ]; poi
. “$ HOME/.bashrc “
essere
essere
# imposta PATH in modo che includa il cestino privato dell’utente, se esiste
Se [ -d “$HOME/bin” ] ; poi
SENTIERO=“$ HOME/bidone:$ PATH“
essere
In generale, ~ / .profile viene letto da tutte le shell. Se esiste ~ / .bash_profile o ~ / .bash_login, Bash non leggerà questo file.
/etc/bash.bashrc e ~ / .bashrc
Questo file contiene la configurazione di Bash e gestisce gli alias locali, i limiti della cronologia memorizzati in .bash_history (vedi sotto) e il completamento di Bash.
# Vedere bash (1) per ulteriori opzioni
HISTCONTROL= ignora entrambi
# aggiungi al file della cronologia, non sovrascriverlo
negozi -S histappend
# per impostare la lunghezza della cronologia, vedere HISTSIZE e HISTFILESIZE in bash (1)
HISTSIZE=1000
HISTFILESIZE=2000
Cosa configurare in quale file
Come hai imparato finora, non esiste un singolo file ma un gruppo di file per configurare Bash. Questi file esistono solo per ragioni storiche, in particolare per il modo in cui le diverse shell si sono evolute e hanno preso in prestito utili funzionalità l’una dall’altra. Inoltre, non sono note regole rigide
definire quale file è destinato a mantenere una certa parte della configurazione. Questi sono i consigli che abbiamo per te (basati su TLDP [10]):
- Tutte le impostazioni che vuoi applicare a tutti gli ambienti dei tuoi utenti dovrebbero essere in / etc / profile.
- Tutti gli alias e le funzioni globali dovrebbero essere archiviati in / etc / bashrc.
- Il file ~ / .bash_profile è il file di configurazione preferito per configurare gli ambienti utente individualmente. In questo file, gli utenti possono aggiungere ulteriori opzioni di configurazione o modificare le impostazioni predefinite.
- Tutti gli alias e le funzioni locali dovrebbero essere archiviati in ~ / .bashrc.
Inoltre, tieni presente che Linux è progettato per essere molto flessibile: se uno qualsiasi dei file di avvio sopra indicati non è presente nel tuo sistema, puoi crearlo.
Collegamenti e riferimenti
- [1] GNU Bash, https://www.gnu.org/software/bash/
- [2] Shell Debian Almquist (Dash), http://gondor.apana.org.au/~herbert/dash/
- [3] Zsh, https://www.zsh.org/
- [4] Certificazione Linux Professional Institute (LPIC), Livello 1, https://www.lpice.eu/en/our-certifications/lpic-1
- [5] GRML, https://grml.org/
- [6] Differenziare login interattivo e shell non di login non interattiva, AskUbuntu, https://askubuntu.com/questions/879364/differentiate-interactive-login-and-non-interactive-non-login-shell
- [7] File di avvio Bash, https://www.gnu.org/software/bash/manual/html_node/Bash-Startup-Files.html#Bash-Startup-Files
- [8] The Shopt Builtin, https://www.gnu.org/software/bash/manual/html_node/The-Shopt-Builtin.html
- [9] Introduzione a Unix – Ordine di caricamento dei file di avvio di Bash, https://medium.com/@youngstone89/unix-introduction-bash-startup-files-loading-order-562543ac12e9
- [10] The Linux Documentation Project (TLDP), https://tldp.org/LDP/Bash-Beginners-Guide/html/sect_03_01.html
Grazie
L’autore desidera ringraziare Gerold Rupprecht per i suoi consigli mentre scriveva questo articolo.