web-dev-qa-db-fra.com

Comprendre .bashrc et .bash_profile

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 uniquement un fichier .bashrc et pas .bash_profile? (Je suis juste confus, donc je demande, je réalise qu'ils sont différents mais il y a peut-être une relation?)

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

Et si je veux que cet alias soit appliqué afin que tous les utilisateurs puissent l'utiliser?

24
Blankman

alias Bash devrait figurer dans les fichiers .bash_aliases ou .bashrc de répertoires de départ individuels. Si vous devez créer des alias bash globaux, ils peuvent aller dans /etc/bash.bashrc, mais il est souvent préférable de les ajouter simplement aux fichiers .bash_aliases ou .bashrc dans /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 .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 existe des idées fausses à ce sujet, que je traite 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 choisir la meilleure méthode pour répondre à vos besoins.

Alias ​​pour utilisateurs individuels

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

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

Quand un shell interactif sans connexion démarre , il code .bashrc dans le répertoire de base de l'utilisateur. Par défaut, dans Ubuntu, le .bashrc de chaque utilisateur lui-même source .bash_aliases, s'il existe.

  • Pour source un fichier doit faire en sorte que son contenu soit exécuté dans le shell current. Les modifications apportées à l'environnement Shell dans un fichier généré persistent même après l'exécution de toutes les commandes du fichier.

La lecture des commentaires dans le .bashrc par défaut d’Ubuntu révèle que c’est officiellement voul que les alias vont dans .bashrc ou .bash_aliases. .bashrc contient déjà des définitions d'alias (exécutez grep '^[[:blank:]]*alias' ~/.bashrc pour les voir) et donne des conseils explicites sur l'emplacement de la nouvelle définition:

# 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 d'interaction connexion shells? Au lieu de .bashrc, connectez-vous à la source .profile.

  • ... Sauf si .bash_login existe, alors il est obtenu à la place.
  • ... Sauf si .bash_profile existe, alors it ​​obtient la source à la place.

Cependant, la bonne nouvelle est que par défaut dans Ubuntu, les commandes dans .bashrcaussi sont exécutées dans des shells de connexion interactifs , car .profile vérifie si le shell actuel est bash (et si .bashrc existe) et, le cas échéant, les 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 dans .bash_aliases dans leurs répertoires personnels (en les créant s'il n'existe pas déjà). C'est un moyen particulièrement propre et simple de rendre les définitions d'alias permanentes au niveau de chaque utilisateur.

Les alias doivent not ​​être définis dans .profile car ils ne seraient pas définis dans des shells autres que ceux utilisés pour la connexion. Contrairement à la plupart des environnements de shell bash, les alias 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 génèrent .profile lors de la connexion graphique, mais:

  1. Cela ne se fait pas nécessairement par un shell bash, 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 coquilles créées en ouvrant une fenêtre de 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 insérer just ​​alias des définitions empêchant tout code dans .profile de s'exécuter!

Dans les cas où .bash_profile ou .bash_login est vraiment utile, généralement un source .profile quelque part en eux, résout ce problème. (Ensuite, le seul problème qui reste est que, comme avec .profile, définir des alias dans .bash_profile ou .bash_login ne fonctionne pas correctement.)

Alias ​​pour Nouvea Utilisateurs individuels, automatiquement

Lorsqu'un compte d'utilisateur du type destiné à représenter un être humain réel est créé, un nouveau répertoire est généralement créé pour servir de répertoire de base. Le contenu de /etc/skel est ensuite copié dans son répertoire personnel. C’est ainsi que plusieurs utilisateurs partent avec des fichiers de configuration similaires dans leurs répertoires personnels. Dans Ubuntu, cela inclut .profile, .bashrc et quelques autres fichiers.

Pour changer les alias définis pour les nouveaux utilisateurs, vous pouvez simplement les mettre dans /etc/skel/.bash_aliases (vous devrez le créer) ou /etc/skel/.bashrc.

Si vous modifiez un fichier déjà existant dans /etc/skel, vous voudrez peut-être le sauvegarder en premier - mais vous ne devriez pas placer la sauvegarde dans /etc/skel, sinon il sera copié dans les répertoires de base des nouveaux utilisateurs.

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

Il est facile 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 avez besoin de créer une nouvelle commande qui fonctionne tout le temps, pour tout le monde, vous ne devriez pas implémenter cette commande comme un alias. Et vous ne pouvez pas forcer avec succès des alias sur les utilisateurs qui n'en veulent pas - ils peuvent simplement unaliasles.

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 que before tous les fichiers du répertoire de base de l'utilisateur sont générés:

  • Les shells de connexion (et uniquement les shells de connexion et autres processus se comportant de la même manière) exécutent automatiquement les commandes à partir de /etc/profile.
  • Seuls les shells non connectés exécutent les commandes dans /etc/bash.bashrc automatiquement, but
  • Le /etc/profile par défaut d'Ubuntu vérifie si le shell en cours d'exécution est bash (et si /etc/bash.bashrc existe) et, le cas échéant, les sources /etc/bash.bashrc.

Ceci est analogue à la façon dont le .profile par utilisateur source par défaut le .bashrc par l'utilisateur si le shell est bash (comme décrit plus haut).

Voici à quoi ressemble le code réel dans le code 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, le ifextérieur vé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 si le code source /etc/bash.bashrc l'est, et si ce n'est pas le cas, pour bash, c'est déjà fait dans /etc/bash.bashrc.

Vous devriez not ​​définir des alias globaux dans /etc/profile pour la même raison que les utilisateurs ne devraient pas les définir dans leur .profiles local: sinon, ils seront définis uniquement pour les shells de connexion, et non pour leurs shells enfants.

Enfin, notez que, contrairement au code .bashrc par défaut, le fichier /etc/bash.bashrc 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 ni les éditer ni les désactiver. (Bien sûr, ils peuvent toujours peuvent ​​le faire, en remplaçant leurs définitions dans leur propre code local .bashrc, .bash_aliases ou ailleurs.)

Lectures complémentaires

38
Eliah Kagan

Voici quelques Nice lecture sur elle. ".bash_profile est exécuté pour les shells de connexion, alors que .bashrc est exécuté pour les shells interactifs sans login"

Donc, pour votre alias, utilisez .bash_profile

5
geermc4