web-dev-qa-db-fra.com

Pourquoi la source ~ / .profile par défaut ~ / .bashrc d'Ubuntu?

Voici le contenu du code ~/.profile fourni avec mon code 13.10 (lignes commentées supprimées):

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

if [ -d "$HOME/bin" ] ; then
    PATH="$HOME/bin:$PATH"
fi

Ceci est hérité de Debian mais pourquoi Canonical a-t-il décidé de le garder? Autant que je sache, ce n'est pas la méthode standard * nix et j'ai vu divers systèmes où cela ne s'est pas produit. Je suppose donc qu'ils ont dû avoir une bonne raison de le faire. Cela peut entraîner un comportement inattendu lors de l'exécution de shells de connexion (par exemple, lors de l'envoi de messages dans la machine, par exemple), où l'utilisateur ne s'attendrait pas à ce que ~/.bashrc soit généré.

Le seul avantage auquel je peux penser est de ne pas confondre l’utilisateur avec de nombreux fichiers de démarrage et de leur permettre d’éditer le .bashrc seul et de le lire, quel que soit le type de shell. Il s'agit toutefois d'un avantage douteux, car il est souvent utile de définir des paramètres différents pour la connexion et pour les shells interactifs, ce qui vous empêche de le faire. De plus, les shell de connexion ne sont très souvent pas exécutés dans un environnement graphique, ce qui peut entraîner des erreurs, des avertissements et des problèmes (oh mon dieu!) En fonction de ce que vous avez défini dans ces fichiers.

Alors pourquoi Ubuntu fait-il cela? Qu'est-ce qui me manque?

30
terdon

Ceci est une décision en amont de Debian. La raison en est expliquée dans ce très gentil wiki post , dont voici un extrait. Le résumé est "pour s'assurer que les connexions avec une interface graphique et non graphique fonctionnent de la même manière":

Prenons xdm comme exemple. Un jour, Pierre revient de vacances un jour et découvre que son administrateur système a installé xdm sur le système Debian. Il se connecte parfaitement et xdm lit son fichier .xsession et exécute Fluxbox. Tout semble aller pour le mieux jusqu'à ce qu'il reçoive un message d'erreur dans la mauvaise localisation! Comme il substitue la variable LANG dans son fichier .bash_profile et que xdm ne lit jamais .bash_profile, sa variable LANG est maintenant définie sur en_US au lieu de fr_CA.

Maintenant, la solution naïve à ce problème est qu'au lieu de lancer "xterm", il pourrait configurer son gestionnaire de fenêtres pour lancer "xterm -ls". Cet indicateur indique à xterm qu'au lieu de lancer un shell normal, il devrait lancer un shell de connexion. Sous cette configuration, xterm génère/bin/bash, mais ajoute "-/bin/bash" (ou peut-être "-bash") dans le vecteur d'argument, ainsi bash se comporte comme un shell de connexion. Cela signifie que chaque fois qu'il ouvrira un nouveau xterm, il lira/etc/profile et .bash_profile (comportement bash intégré), puis .bashrc (car .bash_profile le fera). Cela peut sembler fonctionner correctement au début - ses fichiers de points ne sont pas lourds, donc il ne remarque même pas le retard - mais il y a un problème plus subtil. Il lance également un navigateur Web directement à partir de son menu Fluxbox, lequel hérite de la variable LANG de Fluxbox, qui est désormais définie sur la mauvaise langue. Ainsi, bien que ses xterms puissent fonctionner correctement et que tout ce qui a été lancé à partir de ses serveurs xterms puisse fonctionner correctement, son navigateur Web lui donne toujours des pages dans la mauvaise localisation.

Alors, quelle est la meilleure solution à ce problème? Il n'y a pas vraiment d'un universel. Une meilleure approche consiste à modifier le fichier .xsession pour qu’il ressemble à ceci:

[ -r /etc/profile ] && source /etc/profile
[ -r ~/.bash_profile ] && source ~/.bash_profile
xmodmap -e 'keysym Super_R = Multi_key'
xterm &
exec fluxbox

Ainsi, le shell qui interprète le script .xsession lit dans/etc/profile et .bash_profile s’ils existent et sont lisibles avant d’exécuter xmodmap ou xterm ou d’exécuter le gestionnaire de fenêtres. Toutefois, cette approche présente un inconvénient potentiel: sous xdm, le shell qui lit .xsession s’exécute sans terminal de contrôle. Si/etc/profile ou .bash_profile utilise une commande supposant la présence d’un terminal (telle que "fortune" ou "stty"), ces commandes risquent d’échouer. C'est la raison principale pour laquelle xdm ne lit pas ces fichiers par défaut. Si vous envisagez d'utiliser cette approche, vous devez vous assurer que toutes les commandes de vos "fichiers de points" peuvent être exécutées en toute sécurité en l'absence de terminal.

15
terdon

Ceci est le comportement standard d'Ubuntu, ~/.bashrc est un fichier de démarrage per-interactive-Shell au niveau utilisateur. Lorsque vous ouvrez un terminal, vous démarrez un sans connexion, shell interactif qui lit ~/.bashrc et le contenu de ~/.bashrc est extrait et exporté dans votre environnement Shell actuel. Il est utile d’obtenir toutes les fonctions définies par son utilisateur dans ses variables shell et dans le Shell actuel. Aussi, vous pouvez trouver des lignes comme celle-ci

if [ -f ~/.bash_aliases ]; then
    . ~/.bash_aliases
fi

pour obtenir des alias définis par l'utilisateur dans l'environnement Shell actuel.

Ceci est important afin de fournir une bonne expérience utilisateur également. Par exemple, il est possible de stocker les informations d'identification du proxy dans .bashrc, à moins qu'il ne soit créé aucune application de terminal (, à savoir , pingname__, wgetname__, curlname__, lynxname__, etc. fonctionnera correctement. Ou vous devez fournir les informations d'identification du proxy chaque fois que vous ouvrez un terminal.

Outre le .bashrc par défaut d'Ubuntu, il contient de nombreux alias conviviaux (pour lset grepafin d'imprimer une sortie colorisée), de nombreuses nouvelles définitions pour différentes variables du shell, ce qui améliore l'expérience utilisateur.

Mais dans le cas de votre connexion ssh , ou vous connecter à la console virtuelle , vous obtenez essentiellement un shell de connexion interactif. Le fichier d'initiation du shell est ~/.profile. Par conséquent, à moins que vous n'ayez source ~/.bashrc, vous manquez tous ces paramètres utiles dans votre .bashrc. C'est pourquoi la valeur par défaut de ~/.profile source ~/.bashrc dans Ubuntu

Cas à éviter

  • vous ne devez jamais source le formulaire ~/.profile à l'intérieur de ~/.bashrc en même temps lorsque ~/.bashrc est obtenu à partir de ~/.profile. Cela créera une boucle infinie de situation et par conséquent votre invite de terminal sera suspendue à moins que vous ne appuyiez Ctrl+C. Dans une telle situation, si vous mettez une ligne dans votre ~/.bashrc
set -x

Ensuite, vous pouvez voir que le descripteur de fichier s’arrête lorsque vous ouvrez un terminal.

2
souravc