Comprendre .bashrc et .bash_profile

26

Sur un serveur lorsque je me connecte en tant que root, je vois .bashrc(Ubuntu 10.10).

Sur mon Mac, j'ai un .bash_profile

Ubuntu a-t-il toujours seulement un .bashrcfichier et non .bash_profile? (Je suis juste confus, donc en demandant, je me rends compte que ce sont des O / S différents mais peut-être qu'il y a une relation d'une manière ou d'une autre?)

Sur mon serveur, je veux créer un alias, dois-je le mettre dans .bashrc ?

Que faire si je souhaite que cet alias soit appliqué afin que tous les utilisateurs puissent l'utiliser?

Blankman
la source
1
éventuellement en double de: askubuntu.com/questions/1528/bashrc-or-bash-profile - je vous recommande de changer votre question pour simplement demander où placer les alias globalement.

Réponses:

39

Les alias Bash doivent aller dans les fichiers .bash_aliasesou dans les .bashrcrépertoires de départ individuels. Si vous devez créer des alias bash globaux, ils peuvent entrer /etc/bash.bashrc, mais il est souvent préférable de simplement les ajouter au .bash_aliasesou.bashrc fichiers/etc/skel afin qu'ils soient hérités par les utilisateurs nouvellement créés.

Il est pratiquement toujours faux de définir un alias dans in .profile,.bash_profile ou /etc/profile.

Pour comprendre pourquoi, il faut comprendre dans quelles circonstances les commandes de chacun de ces fichiers sont exécutées. Il y a des idées fausses à ce sujet, que j'examine ci-dessous.

Même si vous souhaitez définir des alias pour plusieurs utilisateurs, vous devez savoir comment ils sont définis pour des utilisateurs individuels, afin de pouvoir décider de la meilleure méthode pour faire ce dont vous avez besoin.

Alias ​​pour les utilisateurs individuels

Surtout si vous utilisez une interface graphique, la plupart de vos shells interactifs sont probablement des shells sans connexion . Même si vous n'utilisez jamais une interface graphique, vous utilisez probablement toujours la non-connexion shells avec une certaine fréquence. Vous voudrez que vos alias fonctionnent dans ces coquilles.

Surtout si vous vous connectez jamais de manière non graphique dans une console virtuelle ou via SSH , vous utilisez probablement des shells de connexion de temps en temps. Vous souhaiterez donc que vos alias fonctionnent également dans des shells de connexion interactifs.

Lorsqu'un shell interactif sans connexion démarre , il se source .bashrcdans le répertoire personnel de l'utilisateur. Par défaut dans Ubuntu, chaque utilisateur .bashrcse source lui - même .bash_aliases, s'il existe.

  • Pour la source d' un fichier est de faire de son contenu à exécuter dans le courant shell. Les modifications apportées à l'environnement shell dans un fichier d'origine persistent même après l'exécution de toutes les commandes du fichier.

La lecture des commentaires par défaut d'Ubuntu .bashrcrévèle qu'il est officiellement prévu que les alias entrent dans .bashrcou .bash_aliases. .bashrccontient déjà quelques définitions d'alias (exécutez grep '^[[:blank:]]*alias' ~/.bashrcpour les voir), et donne des conseils explicites sur l'endroit où mettre de nouvelles définitions:

# Alias definitions.
# You may want to put all your additions into a separate file like
# ~/.bash_aliases, instead of adding them here directly.
# See /usr/share/doc/bash-doc/examples in the bash-doc package.

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

Mais qu'en est-il des shells de connexion interactifs ? Au lieu de .bashrc, connectez-vous à la source des shells .profile.

  • ... À moins qu'il .bash_loginn'existe, il est alors recherché à la place.
  • ... À moins qu'il .bash_profilen'existe, il est alors recherché à la place.

Cependant, les bonnes nouvelles sont que par défaut dans Ubuntu, commandes .bashrcseront également exécutés dans des coquilles de connexion interactifs car la valeur par défaut .profilevérifie si l'interpréteur de commandes actuel bash (et si elle .bashrcexiste), et le cas échéant, des sources .bashrc:

# if running bash
if [ -n "$BASH_VERSION" ]; then
    # include .bashrc if it exists
    if [ -f "$HOME/.bashrc" ]; then
        . "$HOME/.bashrc"
    fi
fi

Je suggère aux utilisateurs de définir de nouveaux alias bash .bash_aliasesdans leurs répertoires personnels (en les créant s'ils n'existent pas déjà). Il s'agit d'un moyen particulièrement propre et simple de rendre les définitions d'alias permanentes au niveau de chaque utilisateur.

Les alias ne doivent pas être définis dans.profile car ils resteraient indéfinis dans les shells sans connexion. Contrairement à la plupart des environnements d'un shell bash, les alias ne sont pas exportés vers des shells enfants:

ek@Io:~$ alias hi='echo "Greetings, $USER!"'
ek@Io:~$ hi
Greetings, ek!
ek@Io:~$ bash
ek@Io:~$ hi
hi: command not found

En particulier, par défaut, la plupart des environnements de bureau .profileproviennent de la connexion graphique, mais:

  1. Ceci n'est pas nécessairement fait par un shell bash, donc les définitions d'alias peuvent même ne pas être traitées, et plus important encore
  2. même si les définitions d'alias sont traitées, elles ne sont pas transmises aux processus enfants . En particulier, ils ne sont pas transmis aux shells créés en ouvrant une fenêtre Terminal!

Les alias ne doivent pas être définis dans .bash_profile(ou .bash_login) pour la même raison, mais aussi pour une autre raison. Créer naïvement l'un de ces fichiers et y mettre uniquement des définitions d'alias empêche l' .profileexécution du code !

Dans les situations où .bash_profileou .bash_loginest vraiment utile, généralement une source .profilequelque part en eux, qui résout ce problème. (Ensuite, le seul problème restant est que, comme avec .profile, la définition d'alias dans .bash_profileou.bash_login ne fonctionne pas correctement.)

Alias ​​pour les nouveaux utilisateurs individuels, automatiquement

Lorsqu'un compte utilisateur du type destiné à représenter un véritable être humain est créé, un nouveau répertoire est généralement créé pour servir de répertoire personnel. Le contenu de /etc/skelest ensuite copié dans son répertoire personnel. C'est ainsi que plusieurs utilisateurs démarrent avec des fichiers de configuration similaires dans leurs répertoires personnels. Dans Ubuntu, ce qui inclut .profile, .bashrcet d'autres fichiers.

Pour modifier les alias définis pour les nouveaux utilisateurs, vous pouvez simplement les insérer /etc/skel/.bash_aliases(vous devrez les créer) ou /etc/skel/.bashrc.

Si vous modifiez un fichier déjà existant, /etc/skelvous voudrez peut-être le sauvegarder d'abord - mais vous ne devez pas placer la sauvegarde /etc/skel, sinon elle sera copiée dans les répertoires personnels des nouveaux utilisateurs.

C'est probablement la meilleure façon pour vous d'ajouter de nouveaux alias pour plusieurs utilisateurs. Les utilisateurs existants peuvent simplement ajouter eux-mêmes les alias. Si vous définissez les alias dans /etc/skel/.bash_aliases, vous pouvez simplement les diriger vers ce fichier, qu'ils peuvent choisir de copier dans leurs répertoires personnels (ou les ajouter dans leur propre .bash_aliasesfichier personnalisé ).

Il est trivial pour un utilisateur de définir un alias. De plus, les alias ne sont pas extrêmement robustes ; ils ne travaillent que dans des circonstances particulières. Si vous devez créer une nouvelle commande qui fonctionne tout le temps, pour tout le monde , vous ne devez pas implémenter cette commande en tant qu'alias. Et vous ne pouvez pas forcer avec succès les alias sur les utilisateurs qui n'en veulent pas - ils peuvent simplement unaliasles utiliser .

Alias ​​globaux, pour tous les utilisateurs

Bien que je vous conseille d'éviter cette approche, vous pouvez définir des alias dans le fichier global /etc/bash.bashrc . Ils seront ensuite définis à la fois pour les shells interactifs sans connexion et pour les shells de connexion interactifs. La raison en est, avant que l' un des fichiers du répertoire personnel de l'utilisateur ne provienne:

  • Les shells de connexion (et uniquement les shells de connexion et autres processus se comportant comme des shells de connexion) exécutent /etc/profileautomatiquement les commandes .
  • Seuls les shells sans connexion exécutent les commandes /etc/bash.bashrcautomatiquement, mais
  • La valeur par défaut d'Ubuntu /etc/profilevérifie si le shell en cours d'exécution est bash (et s'il /etc/bash.bashrcexiste) et, si c'est le cas, les sources /etc/bash.bashrc.

Ceci est analogue à la façon dont l'utilisateur par défaut .profiles'approvisionne par utilisateur .bashrcsi le shell est bash (comme détaillé ci-dessus).

Voici à quoi ressemble le code réel par défaut /etc/profile:

if [ "$PS1" ]; then
  if [ "$BASH" ] && [ "$BASH" != "/bin/sh" ]; then
    # The file bash.bashrc already sets the default PS1.
    # PS1='\h:\w\$ '
    if [ -f /etc/bash.bashrc ]; then
      . /etc/bash.bashrc
    fi
  else
    if [ "`id -u`" -eq 0 ]; then
      PS1='# '
    else
      PS1='$ '
    fi
  fi
fi

Ce bloc effectue également d'autres tâches. Plus précisément, l'extérieur ifvérifie si le shell est susceptible d'être interactif (en vérifiant que le texte d'invite n'est pas vide), puis vérifie si le shell actuel est bash et les sources /etc/bash.bashrcsi c'est le cas, et si cela ne fonctionne pas, pour bash , est déjà fait en /etc/bash.bashrc.

Vous ne devez pas définir d'alias globaux dans /etc/profilepour la même raison que les utilisateurs ne doivent pas les définir dans leurs .profiles locaux : si vous le faites, ils seront définis uniquement pour les shells de connexion et non pour leurs shells enfants.

Enfin, notez que, contrairement à l'utilisateur par défaut .bashrc, le /etc/bash.bashrcfichier par défaut ne contient rien sur les alias. Il est quelque peu inhabituel de donner aux utilisateurs des alias dans un fichier où ils ne peuvent pas les modifier ou les désactiver. (Bien sûr, ils encore peuvent le faire, en remplaçant leurs définitions dans leur propre locale .bashrc, .bash_aliasesou ailleurs.)

Lectures complémentaires

Eliah Kagan
la source
5

Voici une bonne lecture à ce sujet. ".bash_profile est exécuté pour les shells de connexion, tandis que .bashrc est exécuté pour les shells interactifs sans connexion"

Donc, pour votre alias, utilisez .bash_profile

geermc4
la source
4
Mettre des alias .bash_profilen'est pas correct. Dans Ubuntu, .profile(qui s'exécute pour les shells de connexion) les sources .bashrclorsqu'il s'agit d'un shell bash interactif. Ainsi, la mise en alias .bashrc(ou .bash_aliases, en provenance de .bashrc) les définit dans tous les shells bash interactifs. Alias dans les .bash_profilerendements à ce problème , entre autres. Voir ceci , cela , ma réponse et les ~/.bashrccommentaires par défaut recommandant de mettre des alias là ou dedans .bash_aliases.
Eliah Kagan