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.
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
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
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
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
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
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
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
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.
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
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
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
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
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.