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?
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.
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.
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
.
.bash_login
existe, alors il est obtenu à la place..bash_profile
existe, alors it obtient la source à la place.Cependant, la bonne nouvelle est que par défaut dans Ubuntu, les commandes dans .bashrc
aussi 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:
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.)
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 unalias
les.
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:
/etc/profile
./etc/bash.bashrc
automatiquement, but/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 if
exté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 .profile
s 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.)
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