Comprensione della configurazione della shell bash sull'avvio

Comprensione della configurazione della shell bash sull'avvio

Per anni, Bash Shell [1] è stato parte integrante di molte distribuzioni Linux. All'inizio, Bash è stato scelto come Shell ufficiale della GNU perché era ben noto, abbastanza stabile e offriva una decente set di funzionalità.

Oggi la situazione è in qualche modo diversa: Bash è ancora presente ovunque come pacchetto software ma è stata sostituita da alternative nell'installazione standard. Questi includono, ad esempio, Debian Almquist Shell (Dash) [2] (per Debian GNU/Linux) o ZSH [3] (per GRML [5]). Nelle distribuzioni ben note Ubuntu, Fedora, Arch Linux e Linux Mint, Bash è rimasto finora il shell standard.

È abbastanza utile capire l'avvio di Bash e sapere come configurarlo correttamente. Ciò include la personalizzazione dell'ambiente shell, ad esempio, l'impostazione della variabile $ path, regolare l'aspetto del prompt della shell e creare alias. Inoltre, daremo un'occhiata ai due file .Bashrc e .Bash_profile che vengono letti all'avvio. Le conoscenze corrispondenti sono testate nell'esame 1 della certificazione del Linux Professional Institute [4].

Confronto di una shell di accesso interattivo e batch non interattivo

In generale, una shell ha due modalità di funzionamento. Può funzionare come shell di accesso interattivo e come shell non interattiva. La modalità operativa definisce l'avvio bash e quali file di configurazione vengono letti [7]. La modalità di funzionamento può essere differenziata come segue [6]-shell di accesso interattivo, shell interattivo non-logina, shell di accesso non interattivo e shell non interattivo (batch) non-login.

Per dirla semplicemente, una shell interattiva legge e scrive nel 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 login o una shell non login.

Shell di accesso interattivo

Questa modalità si riferisce a accedere al computer su una macchina locale utilizzando un terminale che varia da tty1 a tty4 (dipende dall'installazione: potrebbero esserci più o meno terminali). Inoltre, questa modalità copre l'accesso in remoto in un computer, ad esempio, tramite una shell sicura (SSH) come segue:

$ SSH USER@Sistema remoto
$ SSH USER@telecomando telecomandato

Il primo comando si collega al sistema remoto e apre solo una shell interattiva. Al contrario, il secondo comando si collega al sistema remoto, esegue il comando dato in una shell di accesso non interattiva e termina la connessione SSH. L'esempio seguente mostra questo in modo più dettagliato:

$ SSH LocalHost Uptime
User@LocalHost's Password:
11:58:49 su 23 giorni, 11:41, 6 utenti, media di carico: 0,10, 0,14, 0,20
$

Per scoprire se hai effettuato l'accesso al computer utilizzando una shell di accesso, digita il seguente comando Echo nel tuo terminale:

$ echo $ 0
-Bash
$

Per una shell di accesso, l'output inizia con un "-" seguito dal nome della shell, che si traduce in "-bash" nel nostro caso. Per una shell non login, l'output è solo il nome della shell. L'esempio seguente mostra questo per i due comandi eco $ 0 e il tempo di attività viene dato a SSH come parametro di stringa:

$ ssh localhost "echo $ 0; uptime"
User@LocalHost's Password:
Bash
11:58:49 su 23 giorni, 11:41, 6 utenti, media di carico: 0,10, 0,14, 0,20
$

In alternativa, usa il comando Shopt integrato [8] come segue:

$ shopt login_shell
Login_Shell Off
$

Per una shell non login, il comando restituisce "spento" e per una shell di accesso, "on".

Per quanto riguarda la configurazione per questo tipo di shell, vengono presi in considerazione tre file. Questi sono/etc/profilo, ~/.profilo e ~/.Bash_profile. Vedi sotto per una descrizione dettagliata di questi file.

Shell interattivo non-login

Questa modalità descrive l'apertura di un nuovo terminale, ad esempio, Xterm o Gnome Terminal ed esegue una shell in essa. In questa modalità, i due file/etc/bashrc e ~/.Bashrc vengono letti. Vedi sotto per una descrizione dettagliata di questi file.

Shell non-login non interattivo

Questa modalità è in uso quando si esegue uno script di shell. Lo script shell funziona nella sua sottoinsieme. È classificato come non interattivo a meno che non lo chieda l'input dell'utente. La shell si apre solo per eseguire lo script e lo chiude immediatamente una volta terminato lo script.

./-script locale.sh

Shell di accesso non interattivo

Questa modalità copre l'accesso in un computer da un telecomando, ad esempio, tramite Shell Secure (SSH). Lo script shell-script-script.SH è eseguito localmente, in primo luogo, e la sua uscita viene utilizzata come input di SSH.

./-script locale.Sh | SSH User@Remote System

L'avvio di SSH senza ulteriori comandi avvia una shell di accesso sul sistema remoto. Nel caso in cui il dispositivo di input (stdin) dell'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:

$ echo "uptime" | ssh localhost
Lo pseudo-terminale non sarà assegnato perché stdin non è un terminale.
Frank@LocalHost's Password:
I programmi inclusi nel sistema Debian GNU/Linux sono software gratuito;
I termini esatti di distribuzione per ciascun programma sono descritti in
singoli file in/usr/share/doc/*/copyright.
Debian GNU/Linux non ha assolutamente alcuna garanzia, nella misura in cui
consentito dalla legge applicabile.
Hai una nuova posta.
11:58:49 su 23 giorni, 11:41, 6 utenti, media di carico: 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 viene archiviato nel file di configurazione globale /etc /motd. Per abbreviare l'uscita del terminale, aggiungere l'opzione "SH" come parametro del comando SSH, come mostrato di seguito. Il risultato è che una shell viene aperta per prima e i due comandi vengono eseguiti senza visualizzare il MOTD, prima.

$ echo "uptime" | ssh localhost sh
Frank@LocalHost's Password:
12:03:39 su 23 giorni, 11:46, 6 utenti, media di carico: 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 accesso interattivo
    • /etc/profilo: se esiste, esegue i comandi elencati nel file.
    • ~/.Bash_profile, ~/.Bash_login e ~/.profilo (in quell'ordine). Esegue i comandi dal primo file leggibile trovato dall'elenco. Ogni singolo utente può avere il proprio set di questi file.
  • shell interattivo non-login
    • /etc/bash.Bashrc: configurazione globale di bash. Esegue i comandi se esiste quel file ed è leggibile. Disponibile solo in Debian GNU/Linux, Ubuntu e Arch Linux.
    • ~/.BASHRC: configurazione di bash locale. Esegue i comandi se esiste quel file ed è leggibile.

Può essere utile vedere questo come un grafico. Durante la ricerca, abbiamo trovato il quadro qui sotto, che ci piace molto [9].


Immagine: percorso config.png
testo: Processo di valutazione per la configurazione bash

I diversi file di configurazione spiegati

Per i file spiegati di seguito, non esiste un set di regole generali su quale opzione archivi in ​​quale file (ad eccezione delle opzioni globali vs. opzioni locali). Inoltre, l'ordine in cui vengono letti i file di configurazione sono progettati pensando alla flessibilità in modo che un cambio della shell che usi ti garantisce che sia ancora possibile utilizzare il sistema Linux. Ecco perché sono in uso diversi file che configurano la stessa cosa.

/etc/profilo

Questo file viene utilizzato da Bourne Shell (SH) e conchiglie compatibili con 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 percorso $ e la progettazione prompt per gli utenti regolari, nonché l'utente chiamato "root". L'esempio seguente mostra una parte di/etc/profilo da Debian GNU/Linux.

setUserPath ()
# Directory comuni agli eseguibili per tutti gli utenti
Path = "/usr/local/bin:/usr/bin:/bin"
# Test per l'utente root da aggiungere per i programmi di amministrazione di sistema
if ["'id -u'" -eq 0]; Poi
Path = "/usr/local/sbin:/usr/sbin:/sbin: $ path"
altro
Path = "/USR/Local/Games:/USR/Games: $ Path"
fi
percorso di esportazione

setuSerPath ()
# PS1 è la stringa prompt del comando principale
se ["$ PS1"]; Poi
if ["$ Bash"] && ["$ Bash" != "/bin/sh"]; Poi
# Il file bash.Bashrc imposta già la PS1 predefinita.
# Ps1 = "\ h: \ w \ $"
Se [-f /etc /bash.Bashrc]; Poi
. /etc/bash.Bashrc
fi
altro
if ["'id -u'" -eq 0]; Poi
Ps1 = '#'
altro
Ps1 = '$'
fi
fi
fi

Ulteriori file di configurazione possono essere salvati nella directory /etc /profilo.D. Vengono forniti nella configurazione bash non appena viene letta /etc /profilo.

~/.Bash_profile

Questo file di configurazione locale viene letto ed eseguito quando Bash viene invocato come shell di accesso interattivo. Contiene comandi che dovrebbero essere eseguiti una sola volta, come la personalizzazione della variabile dell'ambiente $.

È abbastanza comune riempire ~/.Bash_profile solo con linee come sotto quella fonte il .file bashrc. Ciò significa ogni volta che si accede al terminale, viene letto il contenuto della configurazione di Bash locale.

Se [-f ~/.Bashrc]; Poi
. ~/.Bashrc
fi

Se il file ~/.esiste bash_profile, quindi bash salterà la lettura da ~/.Bash_login (o ~/.profilo).

~/.Bash_login

I due file ~/.Bash_profile e ~/.Bash_login sono analoghi.

~/.profilo

La maggior parte delle distribuzioni Linux utilizza questo file anziché ~/.Bash_profile. Viene utilizzato per individuare il file locale .Bashrc e per estendere la variabile $ path.

# Se esegui Bash
if [-n "$ Bash_version"]; Poi
# includere .bashrc se esiste
Se [-f "$ home/.Bashrc "]; allora
. "$ Home/.Bashrc "
fi
fi
# Imposta percorso in modo che includa il cestino privato dell'utente se esiste
if [-d "$ home/bin"]; Poi
Path = "$ Home/Bin: $ Path"
fi

In generale, ~/.Il profilo è letto da tutte le shell. Se uno ~/.Bash_profile o ~/.esiste Bash_login, Bash non leggerà questo file.

/etc/bash.Bashrc e ~/.Bashrc

Questo file contiene la configurazione bash e gestisce gli alias locali, i limiti di cronologia memorizzati in .Bash_History (vedi sotto) e Bash Completion.

# Non mettere linee duplicate o linee che iniziano con lo spazio nella storia.
# Vedi Bash (1) per ulteriori opzioni
HistControl = IgnoreBoth
# Aggiungi al file della cronologia, non sovrascriverlo
Shopt -s Histappend
# Per l'impostazione della lunghezza della cronologia, vedere HistSsize 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 motivi storici, in particolare il modo in cui le diverse shell si sono evolute e prese in prestito le caratteristiche utili l'una dall'altra. Inoltre, non ci sono regole rigorose no

Definire quale file dovrebbe mantenere un determinato pezzo della configurazione. Questi sono i consigli che abbiamo per te (basati su TLDP [10]):

  • Tutte le impostazioni che si desidera applicare a tutti gli ambienti degli utenti dovrebbero essere in /etc /profilo.
  • Tutti gli alias e le funzioni globali dovrebbero essere archiviati in /etc /bashrc.
  • Il file ~/.Bash_profile è il file di configurazione preferito per la configurazione di 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 indicati sopra non è presente sul sistema, è possibile crearlo.

Collegamenti e riferimenti

  • [1] GNU Bash, https: // www.gnu.org/software/bash/
  • [2] Debian Almquist Shell (Dash), http: // gondor.APANA.org.Au/~ Herbert/Dash/
  • [3] ZSH, https: // www.zsh.org/
  • [4] Linux Professional Institute Certification (LPIC), Livello 1, https: // www.lpice.EU/EN/Our-certifications/LPIC-1
  • [5] GRML, https: // GRML.org/
  • [6] Differenziare l'accesso interattivo e shell non login non interattivo, Askubuntu, https: // askubuntu.com/Domande/879364/differenziare il login-e-non-non-non-login-shell
  • [7] File di avvio bash, https: // www.gnu.org/software/bash/manuale/html_node/bash-startup-files.HTML#Bash-Startup-Files
  • [8] The Shopt Builtin, https: // www.gnu.org/software/bash/manuale/html_node/the-shopt-builtin.html
  • [9] UNIX INTRODUZIONE - File di avvio bash Ordine di caricamento, https: // medium.com/@youngstone89/unix-introduzione-bash-startup-files-caroling-ordine-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 il suo consiglio mentre scrive questo articolo.