I file di avvio della shell Bash

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.

/etc/profile

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

La directory /etc/profile.d

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

/etc/profile.d/dircolors.sh

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

/etc/profile.d/extrapaths.sh

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

/etc/profile.d/readline.sh

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

/etc/profile.d/tinker-term.sh

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

/etc/profile.d/umask.sh

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

/etc/profile.d/X.sh

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

/etc/profile.d/xterm-titlebars.sh

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

/etc/profile.d/i18n.sh

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.

Altri valori di inizializzazione

Altre inizializzazioni possono essere facilmente aggiunte a profile aggiungendo ulteriori script alla directory /etc/profile.d.

/etc/bashrc

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

~/.bash_profile

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

~/.bashrc

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

~/.bash_logout

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

/etc/dircolors

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