Il programma shell /bin/bash (d'ora in poi chiamata solo "la shell") usa una collezione di file di avvio per aiutare la creazione di un ambiente. Ciascun file ha un uso specifico e può influenzare diversamente il login e gli ambienti interattivi. I file nella directory /etc generalmente forniscono le impostazioni globali. Se esiste un file equivalente nella propria home directory esso sovrascrive le impostazioni globali.
Una shell di login interattiva è avviata dopo un login riuscito, usando /bin/login, leggendo il file /etc/passwd. Questa invocazione della shell normalmente legge /etc/profile e il suo equivalente privato ~/.bash_profile allo startup.
Una shell interattiva non-login è normalmente avviata dalla linea di comando (es., [prompt]$/bin/bash) o dal comando /bin/su. Una shell interattiva non-login è anche avviata con un programma terminale come xterm o konsole dall'ambiente grafico. Questo tipo di invocazione della shell normalmente copia l'ambiente genitore e quindi legge il file utente ~/.bashrc per verificare istruzioni di configurazione addizionali all'avvio.
Una shell non interattiva è normalmente presente quando uno script di shell è in funzione. Essa non è interattiva perché processa uno script e non aspetta l'input dell'utente tra i comandi. Per queste invocazioni della shell è usato solo l'ambiente ereditato dalla shell genitore.
Il file ~/.bash_logout non è usato per una invocazione della shell. Esso è letto ed eseguito quando un utente esce da una shell di login interattiva.
Ai file standard /etc/bashrc è chiamato da ~/.bashrc dell'utente per l'inizializzazione globale delle shell non-login.
Per maggiori informazioni vedere info bash -- Nodi: Bash Startup Files and Interactive Shells.
Qui c'è un /etc/profile di base. Questo file inizia impostando alcune funzioni helper e alcuni parametri di base. Esso specifica alcuni parametri della history di bash e, per ragioni di sicurezza, disabilita il mantenimento di un file history permanente per l'utente root. Esso setta un prompt di default dell'utente. Esso inoltre chiama piccoli script che eseguono un solo compito nella directory /etc/profile.d per fornire la maggior parte dell'inizializzazione.
Per maggiori informazioni sulle sequenze di escape che si possono usare per il proprio prompt (es. la variabile ambiente PS1) vedere info bash -- Nodo: Printing a Prompt.
cat > /etc/profile << "EOF" # Begin /etc/profile # Written for Beyond Linux From Scratch # by James Robertson <jameswrobertson@earthlink.net> # modifications by Dagmar d'Surreal <rivyqntzne@pbzpnfg.arg> # System wide environment variables and startup programs. # System wide aliases and functions should go in /etc/bashrc. Personal # environment variables and startup programs should go into # ~/.bash_profile. Personal aliases and functions should go into # ~/.bashrc. # Functions to help us manage paths. Second argument is the name of the # path variable to be modified (default: PATH) pathremove () { local IFS=':' local NEWPATH local DIR local PATHVARIABLE=${2:-PATH} for DIR in ${!PATHVARIABLE} ; do if [ "$DIR" != "$1" ] ; then NEWPATH=${NEWPATH:+$NEWPATH:}$DIR fi done export $PATHVARIABLE="$NEWPATH" } pathprepend () { pathremove $1 $2 local PATHVARIABLE=${2:-PATH} export $PATHVARIABLE="$1${!PATHVARIABLE:+:${!PATHVARIABLE}}" } pathappend () { pathremove $1 $2 local PATHVARIABLE=${2:-PATH} export $PATHVARIABLE="${!PATHVARIABLE:+${!PATHVARIABLE}:}$1" } # Set the initial path export PATH=/bin:/usr/bin if [ $EUID -eq 0 ] ; then pathappend /sbin:/usr/sbin unset HISTFILE fi # Setup some environment variables. export HISTSIZE=1000 export HISTIGNORE="&:[bf]g:exit" #export PS1="[\u@\h \w]\\$ " export PS1='\u@\h:\w\$ ' for script in /etc/profile.d/*.sh ; do if [ -r $script ] ; then . $script fi done # Now to clean up unset pathremove pathprepend pathappend # End /etc/profile EOF
Ora creare la directory /etc/profile.d, in cui sono messi gli script di inizializzazione individuali.
install --directory --mode=0755 --owner=root --group=root /etc/profile.d
Questo script usa i file ~/.dircolors e /etc/dircolors per controllare i colori dei nomi dei file in un elenco di directory. Esso controlla l'output colorato di cose come ls --color. La spiegazione di come inizializzare questi file è al termine di questa sezione.
cat > /etc/profile.d/dircolors.sh << "EOF" # Setup for /bin/ls to support color, the alias is in /etc/bashrc. if [ -f "/etc/dircolors" ] ; then eval $(dircolors -b /etc/dircolors) if [ -f "$HOME/.dircolors" ] ; then eval $(dircolors -b $HOME/.dircolors) fi fi alias ls='ls --color=auto' EOF
Questo script aggiunge molti path utili alle variabili ambiente PATH e PKG_CONFIG_PATH. Volendo si possono togliere i commenti dall'ultima sezione per mettere un punto al termine del proprio path. Questo permetterà agli eseguibili nella directory di lavoro corrente di essere eseguiti senza specificare un ./, tuttavia è bene sapere che questo generalmente è considerato un rischio di sicurezza.
cat > /etc/profile.d/extrapaths.sh << "EOF" if [ -d /usr/local/lib/pkgconfig ] ; then pathappend /usr/local/lib/pkgconfig PKG_CONFIG_PATH fi if [ -d /usr/local/bin ]; then pathprepend /usr/local/bin fi if [ -d /usr/local/sbin -a $EUID -eq 0 ]; then pathprepend /usr/local/sbin fi for directory in $(find /opt/*/lib/pkgconfig -type d 2>/dev/null); do pathappend $directory PKG_CONFIG_PATH done for directory in $(find /opt/*/bin -type d 2>/dev/null); do pathappend $directory done if [ -d ~/bin ]; then pathprepend ~/bin fi #if [ $EUID -gt 99 ]; then # pathappend . #fi EOF
Questo script imposta il file di configurazione di default inputrc. Se l'utente non ha impostazioni individuali viene usato il file globale.
cat > /etc/profile.d/readline.sh << "EOF" # Setup the INPUTRC environment variable. if [ -z "$INPUTRC" -a ! -f "$HOME/.inputrc" ] ; then INPUTRC=/etc/inputrc fi export INPUTRC EOF
Alcune applicazioni necessitano di un'impostazione specifica di TERM per supportare i colori.
cat > /etc/profile.d/tinker-term.sh << "EOF" # This will tinker with the value of TERM in order to convince certain # apps that we can, indeed, display color in their window. if [ -n "$COLORTERM" ]; then export TERM=xterm-color fi if [ "$TERM" = "xterm" ]; then export TERM=xterm-color fi EOF
Settare il valore di umask è importante per la sicurezza. Qui i permessi di scrittura di default del gruppo sono disattivati per gli utenti del sistema e quando nome utente e nome gruppo non sono gli stessi.
cat > /etc/profile.d/umask.sh << "EOF" # By default we want the umask to get set. if [ "$(id -gn)" = "$(id -un)" -a $EUID -gt 99 ] ; then umask 002 else umask 022 fi EOF
Se X è installato anche le variabili PATH e PKG_CONFIG_PATH vengono aggiornate.
cat > /etc/profile.d/X.sh << "EOF" if [ -x /usr/X11R6/bin/X ]; then pathappend /usr/X11R6/bin fi if [ -d /usr/X11R6/lib/pkgconfig ] ; then pathappend /usr/X11R6/lib/pkgconfig PKG_CONFIG_PATH fi EOF
Questo script mostra un esempio di un modo diverso di settare il prompt. La variabile normale, PS1, è sostituita da PROMPT_COMMAND. Se settato, il valore di PROMPT_COMMAND è eseguito come un comando prima di mostrare ciascun prompt primario.
cat > /etc/profile.d/xterm-titlebars.sh << "EOF" # The substring match ensures this works for "xterm" and "xterm-xfree86". if [ "${TERM:0:5}" = "xterm" ]; then PROMPT_COMMAND='echo -ne "\033]0;${USER}@${HOSTNAME} : ${PWD}\007"' export PROMPT_COMMAND fi EOF
Questo script mostra come impostare alcune variabili ambiente necessarie per il supporto del linguaggio nativo. L'impostazione appropriata di queste variabili dà:
l'output dei programmi tradotto nel proprio linguaggio nativo
la corretta classificazione dei caratteri in lettere, numeri e altre classi – questo è necessario perché Bash accetti appropriatamente le pressioni dei tasti in localizzazioni non inglesi
il corretto ordinamento alfabetico per il proprio paese
corrette dimensioni di default dei fogli
corretta formattazione dei valori di moneta, ora e data
Sostituire [ll] con il codice di due lettere della propria lingua (es., “en”) e [CC] con il codice di due lettere per il proprio paese (es., “GB”). Si potrebbe anche specificare (ed oggi è la forma preferita) la propria codifica del carattere (es., “iso8859-1”) dopo un punto (così il risultato sarebbe “en_GB.iso8859-1”). Digitare il seguente comando per maggiori informazioni:
man 3 setlocale
L'elenco di tutte le localizzazioni supportate da Glibc può essere ottenuto eseguendo i seguenti comandi:
locale -a
Quando si è sicuri dei propri settaggi locali creare il file /etc/profile.d/i18n.sh:
cat > /etc/profile.d/i18n.sh << "EOF" # Set up i18n variables export LC_ALL=[ll]_[CC] export LANG=[ll]_[CC] export G_FILENAME_ENCODING=@locale EOF
La variabile LC_ALL imposta lo stesso valore per tutte le categorie locali. Per un miglior controllo si può preferire impostare i valori individualmente per tutte le categorie elencate nell'output del comando locale.
La variabile G_FILENAME_ENCODING dice alle applicazioni come Glib e GTK+ che i nomi dei file sono nella codifica locale di default e non in UTF-8 come si suppone per default.
Qui c'è un /etc/bashrc di base. I commenti nel file devono spiegare tutto ciò che serve.
cat > /etc/bashrc << "EOF" # Begin /etc/bashrc # Written for Beyond Linux From Scratch # by James Robertson <jameswrobertson@earthlink.net> # updated by Bruce Dubbs <bdubbs@linuxfromscratch.org> # Make sure that the terminal is set up properly for each shell if [ -f /etc/profile.d/tinker-term.sh ]; then source /etc/profile.d/tinker-term.sh fi if [ -f /etc/profile.d/xterm-titlebars.sh ]; then source /etc/profile.d/xterm-titlebars.sh fi # System wide aliases and functions. # System wide environment variables and startup programs should go into # /etc/profile. Personal environment variables and startup programs # should go into ~/.bash_profile. Personal aliases and functions should # go into ~/.bashrc # Provides a colored /bin/ls command. Used in conjunction with code in # /etc/profile. alias ls='ls --color=auto' # Provides prompt for non-login shells, specifically shells started # in the X environment. [Review the LFS archive thread titled # PS1 Environment Variable for a great case study behind this script # addendum.] #export PS1="[\u@\h \w]\\$ " export PS1='\u@\h:\w\$ ' # End /etc/bashrc EOF
Qui c'è un ~/.bash_profile di base. Se si vuole che ciascun nuovo utente abbia automaticamente questo file cambiare l'output del comando in /etc/skel/.bash_profile e verificare i permessi dopo che il comando è stato eseguito. Si può quindi copiare /etc/skel/.bash_profile nelle home directory degli utenti già esistenti, incluso root, e impostare appropriatamente proprietario e gruppo.
cat > ~/.bash_profile << "EOF" # Begin ~/.bash_profile # Written for Beyond Linux From Scratch # by James Robertson <jameswrobertson@earthlink.net> # updated by Bruce Dubbs <bdubbs@linuxfromscratch.org> # Personal environment variables and startup programs. # Personal aliases and functions should go in ~/.bashrc. System wide # environment variables and startup programs are in /etc/profile. # System wide aliases and functions are in /etc/bashrc. append () { # First remove the directory local IFS=':' local NEWPATH for DIR in $PATH; do if [ "$DIR" != "$1" ]; then NEWPATH=${NEWPATH:+$NEWPATH:}$DIR fi done # Then append the directory export PATH=$NEWPATH:$1 } if [ -f "$HOME/.bashrc" ] ; then source $HOME/.bashrc fi if [ -d "$HOME/bin" ] ; then append $HOME/bin fi unset append # End ~/.bash_profile EOF
Qui c'è un ~/.bashrc di base. I commenti e le istruzioni precedenti per usare /etc/skel per .bash_profile si applicano anche qui. Solo i nomi dei file sono diversi.
cat > ~/.bashrc << "EOF" # Begin ~/.bashrc # Written for Beyond Linux From Scratch # by James Robertson <jameswrobertson@earthlink.net> # Personal aliases and functions. # Personal environment variables and startup programs should go in # ~/.bash_profile. System wide environment variables and startup # programs are in /etc/profile. System wide aliases and functions are # in /etc/bashrc. if [ -f "/etc/bashrc" ] ; then source /etc/bashrc fi # End ~/.bashrc EOF
Questo è un ~/.bash_logout vuoto che può essere usato come modello. Si noterà che ~/.bash_logout non include il comando clear. Questo perché clear è gestito nel file /etc/issue.
cat > ~/.bash_logout << "EOF" # Begin ~/.bash_logout # Written for Beyond Linux From Scratch # by James Robertson <jameswrobertson@earthlink.net> # Personal items to perform on logout. # End ~/.bash_logout EOF
Se si vuole usare la capacità dircolors eseguire il seguente comando. I passi visti in precedenza per il setup di /etc/skel possono essere usati anche qui per fornire un file ~/.dircolors quando viene creato un nuovo utente. Come prima cambiare il nome file in output nel seguente comando e assicurarsi che permessi, proprietario e gruppo siano corretti su questi file creati e/o copiati.
dircolors -p > /etc/dircolors
Se si vogliono personalizzare i colori usati per i diversi tipi di file si può editare il file /etc/dircolors. Le istruzioni per settare i colori sono integrate nel file.
Infine Ian Macdonald ha scritto un'eccellente collezione di suggerimenti e trucchi per espandere il proprio ambiente shell. Lo si può leggere online presso http://www.caliban.org/bash/index.shtml.
Last updated on