Les fichiers de démarrage du shell Bash

Le programme shell /bin/bash (que l'on nommera simplement "le shell" à partir de maintenant) utilise une collection de fichiers de démarrage pour aider à la création d'un environnement de travail. Chaque fichier a une utilisation spécifique et peut affecter différemment la connexion et les environnements interactifs. Les fichiers dans le répertoire /etc apportent habituellement une configuration globale. Si un fichier équivalent existe dans votre répertoire personnel, il pourrait écraser les paramètrages globaux.

Un shell interactif de connexion est lancé après une connexion réussie en utilisant /bin/login et en lisant le fichier /etc/passwd. Cet appel lit habituellement /etc/profile et son équivalent personnel ~/.bash_profile au lancement.

Un shell interactif sans connexion est habituellement lancé à la ligne de commande (c'est-à-dire [invite]$/bin/bash) ou par la commande /bin/su. Un shell interactif sans connexion est aussi lancé avec un programme de type terminal comme xterm ou konsole à l'intérieur d'un environnement graphique. Ce type d'appel de shell copie normalement l'environnement parent puis lit le fichier ~/.bashrc de l'utilisateur pour les instructions de configuration supplémentaires.

Un shell non interactif est généralement présent lorsqu'un script shell est lancé. Il est non interactif car il exécute un script et n'attend pas une saisie de l'utilisateur entre les commandes. Pour ces appels de shell, seul l'environnement hérité du shell parent est utilisé.

Le fichier ~/.bash_logout n'est pas utilisé pour un appel du shell. Il est lu et exécuté à la sortie du shell par un utilisateur.

Aux fichiers standards, nous pouvons aussi ajouter /etc/bashrc, appelé à partir du ~/.bashrc de l'utilisateur pour l'initialisation système des shells sans connexion.

Pour plus d'informations, voir info bash -- Noeud: Bash Startup Files and Interactive Shells.

/etc/profile

Voici un /etc/profile de base. Ce fichier commence par l'initialisation de quelques fontions d'aide et autres paramètres basiques. Il spécifie quelques paramètres d'historique pour bash et, pour des raisons de sécurité, désactive la conservation du fichier d'historique permanent de l'utilisateur root. Il initialise aussi une invite par défaut. Il appelle ensuite des petits scripts à but unique dans le répertoire /etc/profile.d fournissant d'autres initialisations.

Pour plus d'informations sur les séquences d'échappement que vous pouvez utiliser avec votre invite (c'est-à-dire la variable d'environnement nPS1), voir info bash -- Nœud : afficher une invite.

cat > /etc/profile << "EOF"
# Début de /etc/profile
# Écrit pour Beyond Linux From Scratch
# par James Robertson <jameswrobertson@earthlink.net>
# modifications par Dagmar d'Surreal <rivyqntzne@pbzpnfg.arg>

# Variables d'environnement globales et programmes de démarrage

# Les alias systèmes et les fonctions doivent aller dans /etc/bashrc. Les
# variables d'environnements et les programmes de lancement personnels doivent
# aller dans ~/.bash_profile. Les alias et fonctions personnels doivent aller
# dans ~/.bashrc.

# Fonction d'aide à la gestion des chemins.
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"
}
 
if [ $EUID -eq 0 ] ; then
        unset HISTFILE
fi
 
# Configuration de quelques variables d'environnement.
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 [ -x $script ] ; then
                . $script
        fi
done
 
# Now to clean up after ourselves
unset pathremove pathprepend pathappend 

# Fin /etc/profile
EOF

Maintenant, créez le répertoire /etc/profile.d.

install --directory --mode=0755 --owner=root --group=root /etc/profile.d

/etc/profile.d/dircolors.sh

Ce script utilise les fichiers ~/.dircolors et /etc/dircolors pour contrôler les couleurs des noms de fichiers dans une liste du répertoire. Ils contrôlent la sortie colorisée de choses comme ls --color. L'explication sur l'initialisation de ces fichiers se trouve à la fin de cette section.

cat > /etc/profile.d/dircolors.sh << "EOF"
#  Configuration pour le support de la couleur dans /bin/ls, l'alias est
#+ dans /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

Ce script ajoute quelques chemins utiles aux variables d'environnement PATH et PKG_CONFIG_PATH. Si vous voulez, vous pouvez décommenter la dernière section pour placer un point à la fin de votre chemin. Ceci permettra l'exécution d'applications du répertoire courant sans avoir à spécifier un ./. Néanmoins, vous êtes prévenu que ceci est généralement considéré comme un problème de sécurité.

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); do
        pathappend $directory PKG_CONFIG_PATH
done
for directory in $(find /opt/*/bin -type d); do
        pathappend $directory
done
if [ -d ~/bin ]; then
        pathprepend ~/bin
fi
#if [ $EUID -gt 99 ]; then
#        pathappend .
#fi
EOF

/etc/profile.d/readline.sh

Ce script initialise le fichier de configuration par défaut inputrc. Si l'utilisateur n'a pas de configurations individuelles, il utilise le fichier global.

cat > /etc/profile.d/readline.sh << "EOF"
# Configuration de la variable d'environnement.
if [ -z "$INPUTRC" -a ! -f "$HOME/.inputrc" ] ; then
        INPUTRC=/etc/inputrc
fi
export INPUTRC
EOF

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

Quelques applications ont besoin d'un paramètrage spécifique de TERM pour supporter la couleur.

cat > /etc/profile.d/tinker-term.sh << "EOF"
# Ceci va améliorer la valeur de TERM pour convaincre certaines applications que
# nous pouvons vraiment afficher de la couleur dans leur fenêtre.
 
if [ -n "$COLORTERM" ]; then
  export TERM=xterm-color
fi
 
if [ "$TERM" = "xterm" ]; then
  export TERM=xterm-color
fi
EOF

/etc/profile.d/umask.sh

Initialiser la valeur d'umask est important pour la sécurité. Ici, nous désactivons les droits d'écriture du groupe sur les utilisateurs système et lorsque nom d'utilisateur et nom de groupe ne sont pas identiques.

cat > /etc/profile.d/umask.sh << "EOF"
# Par défaut, nous voulons qu'umask soit initialisée.
if [ "$(id -gn)" = "$(id -un)" -a $EUID -gt 99 ] ; then
  umask 002
else
  umask 022
fi
EOF

/etc/profile.d/X.sh

Si X est installé, nous allons aussi mettre à jour les variables PATH et PKG_CONFIG_PATH.

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

Ce script affiche un exemple d'une autre façon d'initialiser l'invite. La variable d'environnement normale, PS1, est remplacée par PROMPT_COMMAND. Si ell est initialisée, la valeur de PROMPT_COMMAND est exécutée comme une commande avant chaque invote primaire.

cat > /etc/profile.d/xterm-titlebars.sh << "EOF"
# The substring match ensures this will work 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

D'autres initialisations peuvent facilement être ajoutées au profile en ajoutant des scripts supplémentaires vers le répertoire /etc/profile.d.

/etc/bashrc

Ceci est une base pour /etc/bashrc. Les commentaires inclus dans le fichier devraient tout expliquer.

cat > /etc/bashrc << "EOF"
# Début de /etc/bashrc 
# Écrit pour Beyond Linux From Scratch 
# par James Robertson <jameswrobertson@earthlink.net>

# Alias et fonctions système.

# Les variables d'environnement système et les programmes de lancement
# devraient aller sous /etc/profile. Les variables d'environnement personnel
# et les programmes de lancement devraient aller dans ~/.bash_profile. Les
# alias personnels et les fonctions devraient aller dans ~/.bashrc

# Fournit une commmande /bin/ls colorée. Utilisé avec du code provenant de
# /etc/profile.

alias ls='ls --color=auto'

# Fournit une invite pour les shells sans connexion, spécialement les shells
# lancés dans l'environnement X. [Revoir les
# archives LFS, dont celle titrée
# PS1 Environment Variable for a great case study behind this script addendum.]

#export PS1="[\u@\h \w]\\$ "
export PS1='\u@\h:\w\$ '

# Fin de /etc/bashrc
EOF

~/.bash_profile

Voici la base de ~/.bash_profile. Si vous voulez que chaque nouvel utilisateur ait ce fichier automatiquement, modifiez simplement la sortie de la commande par /etc/skel/.bash_profile et vérifiez les droits après le lancement de la commande. Vous pouvez ensuite copier /etc/skel/.bash_profile dans les répertoires personnels des utilisateurs déjà existants, ceci incluant root, et configurer les utilisateur et groupe de façon appropriée.

cat > ~/.bash_profile << "EOF"
# Début de ~/.bash_profile
# Écrit pour Beyond Linux From Scratch
# par James Robertson <jameswrobertson@earthlink.net>
# mis à jour par Bruce Dubbs <bdubbs@linuxfromscratch.org>

# Variables d'environnement personnelles et programmes de lancement.

# Les alias personnels et les fonctions devraient aller dans ~/.bashrc.
# Les variables d'environnement système et les programmes de lancement sont
# dans /etc/profile.
# Les alias et les fonctions système sont dans /etc/bashrc.

append () {
  # Tout d'abord, supprimez le répertoire
  local IFS=':'
  local NEWPATH
  for DIR in $PATH; do
     if [ "$DIR" != "$1" ]; then
       NEWPATH = ${NEWPATH:+$NEWPATH:}$DIR
     fi     
  done
  
  # Puis, ajoutez le répertoire
  export PATH=$NEWPATH:$1
}

if [ -f "$HOME/.bashrc" ] ; then
        source $HOME/.bashrc
fi

if [ -d "$HOME/bin" ] ; then
  append $HOME/bin      
fi

unset append

# Fin de ~/.bash_profile
EOF

~/.bashrc

Voici la base d'un ~/.bashrc. Les commentaires et instructions pour utiliser /etc/skel de .bash_profile s'appliquent ici aussi. Seuls les noms de fichiers cibles sont différents.

cat > ~/.bashrc << "EOF"
# Début de ~/.bashrc
# Écrit pour Beyond Linux From Scratch
# par James Robertson <jameswrobertson@earthlink.net>

# Alias personnels et fonctions.

# Les alias personnels et les fonctions devraient aller dans ~/.bashrc.
# Les variables d'environnement système et les programmes de lancement sont
# dans /etc/profile.
# Les alias et les fonctions système sont dans /etc/bashrc.

if [ -f "/etc/bashrc" ] ; then
        source /etc/bashrc
fi

# Fin de ~/.bashrc
EOF

~/.bash_logout

C'est un ~/.bash_logout vide qui peut être utilisé comme modèle. Vous noterez que la base ~/.bash_logout n'inclut pas de commande clear. En effet, celui-ci est géré par le fichier /etc/issue.

cat > ~/.bash_logout << "EOF"
# Début de ~/.bash_logout
# Écrit pour Beyond Linux From Scratch
# par James Robertson <jameswrobertson@earthlink.net>

# Éléments personnels pour lancer une déconnexion.

# Fin de ~/.bash_logout
EOF

/etc/dircolors

Si vous voulez utiliser la fonctionnalité dircolors, alors lancez la commande suivante. Les étapes de configuration de /etc/skel peuvent aussi être utilisées ici pour fournir un fichier .dircolors quand un nouvel utilisateur est créé. Comme auparavant, modifiez simplement le nom du fichier en sortie sur la ligne de commande et assurez-vous que les droits, propriétaire et groupe sont corrects sur les fichiers créés et/ou copiés.

dircolors -p > /etc/dircolors

Si vous souhaitez personnaliser les couleurs utilisées par différents types de fichiers, vous pouvez éditer le fichier /etc/dircolors. Les instructions de configuration des couleurs sont intégrées au fichier.

Enfin, Ian Macdonald a écrit une excellente collection d'astuces et de conseils pour améliorer votre environnement shell. Vous pouvez le lire en ligne sur http://www.caliban.org/bash/index. shtml.