Réponses:
Ce n'est pas appelé bash_profile
, mais l'endroit standard pour la configuration bash globale est /etc/bash.bashrc
. Il est habituel d'appeler cela depuis /etc/profile
si le shell est bash. Par exemple, dans mon /etc/profile
j'ai:
if [ "$PS1" ]; then
if [ "$BASH" ] && [ "$BASH" != "/bin/sh" ]; then
# The file bash.bashrc already sets the default PS1.
# PS1=’0
if [ ‐f /etc/bash.bashrc ]; then
. /etc/bash.bashrc
fi
fi
fi
En termes d'utilisation, /etc/profile
fournit une configuration à l'échelle du système pour tous les shells compatibles Bourne (sh, bash, ksh, etc.). Il n'y a normalement pas besoin d'équivalent /etc/bash_profile
, car l'intention du fichier de profil est de contrôler le comportement des shells de connexion. Normalement, tout ce que vous voulez y faire ne sera pas spécifique à bash. /etc/bash.bashrc
est spécifique à bash et sera exécuté pour les shells de connexion et non-login.
Pour compliquer encore les choses, il semble que OS X n'en ait même pas /etc/bash.bashrc
. Cela est probablement lié au fait que les terminaux sous OS X fonctionnent par défaut en tant que shells de connexion , de sorte que la distinction est perdue:
Une exception aux directives de la fenêtre de terminal est Terminal.app de Mac OS X, qui exécute un shell de connexion par défaut pour chaque nouvelle fenêtre de terminal, appelant .bash_profile au lieu de .bashrc. D'autres émulateurs de terminaux GUI peuvent faire de même, mais la plupart ont tendance à ne pas le faire.
Je n'exécute pas OS X, donc l'étendue de mes connaissances s'arrête là.
/etc/profile
par défaut dans Ubuntu 12.04. Que suggéreriez-vous à la place si l'on voulait un /etc/profile
qui n'était exécuté que sous bash, et aucun autre shell compatible sh?
/etc/profile
fichier pour mon système contient un commentaire au sommet qui se lit: # System-wide .profile for sh(1)
. Est-ce que cela signifie profile
est sh
spécifique? sh
Exécute- t-il en quelque sorte avant bash
?
sh
est un sous-ensemble de bash
. /etc/profile
est exécuté pour sh
, bash
et tous les autres shells compatibles Bourne.
/etc/bashrc
sur le mac, pas /etc/bash.bashrc
. Il semble également fonctionner /bin/sh
également.
/etc/profile
est le mondial bash_profile
. Il n'y a pas de fichier spécifique à bash, bash lit simplement le fichier standard lu par tous les shell de style Bourne. C'est là que vous pouvez définir des variables d'environnement à l'échelle du système.
Voir Existe - t-il un fichier équivalent ".bashrc" lu par tous les shells? pour un aperçu générique des fichiers de démarrage courants de bash.
Cela ne se charge pas /etc/profile
, donc rien dans n'est /etc/profile.d/
chargé (contrairement aux shells de connexion, voir la fin).
Le fichier global pour cela est / etc / bashrc ou /etc/bash.bashrc (selon l' -DSYS_BASHRC=
indicateur défini au moment de la compilation):
# System-wide .bashrc file for interactive bash(1) shells.
if [ -z "$PS1" ]; then
return
fi
PS1='\h:\W \u\$ '
# Make bash check its window size after a process completes
shopt -s checkwinsize
[ -r "/etc/bashrc_$TERM_PROGRAM" ] && . "/etc/bashrc_$TERM_PROGRAM"
Habituellement, il est conseillé de laisser ce fichier tel quel (autant que possible) pour éviter les conflits. La stratégie que j'utilise est similaire à celle que les shells de connexion (/ etc / profile) utilisent.
Ma stratégie consiste à ajouter un chargeur au fichier ci-dessus:
# Add new directory analog to /etc/profile.d
mkdir /etc/bashrc.d
# Write the loader to /etc/bash.bashrc (it might be /etc/bashrc on as mentioned above)
cat >> /etc/bash.bashrc << 'EOF'
# I appended this: Load scripts from /etc/bashrc.d
if test -d /etc/bashrc.d; then
for script in /etc/bashrc.d/*.sh; do
test -r "$script" && . "$script"
done
unset item
fi
EOF
Maintenant, je peux facilement ajouter n personnalisations au fichier shell global interactif (bash) en plaçant de nouveaux fichiers .sh dans le répertoire /etc/bashrc.d.
/etc/bashrc.d/grep.sh
alias grep='grep --color=auto'
Vous pouvez le faire avec ce one-liner:
printf "alias grep=\'grep --color=auto\'" > /etc/bashrc.d/grep.sh
Si, après avoir lu ceci, vous n'êtes pas convaincu, faites-le pour vous convaincre:
printf "alias grep=\'grep --color=auto\'" > /etc/profile.d/grep.sh
Ouvrez un nouvel émulateur de terminal et recherchez un mot commun dans votre répertoire utilisateur comme "le" en utilisant grep
grep -r 'the'
Rien ne doit être coloré. Faites la même chose dans une console virtuelle en faisant CTRLALTF1 (rappelez-vous que votre serveur X fonctionne probablement sur CTRLALTF7 afin que vous puissiez revenir en arrière. Si vous oubliez, redémarrez simplement votre gestionnaire de bureau, par exemple)
grep -r 'the'
donnera des résultats colorés comme souhaité.
Rien ne doit être coloré. Faites la même chose dans une console virtuelle en faisant CTRLALTF1(rappelez-vous que votre serveur X fonctionne probablement CTRLALTF7pour que vous puissiez revenir en arrière. Si vous oubliez, redémarrez simplement votre gestionnaire de bureau, par exemple)
grep -r 'the'
donnera des résultats colorés comme souhaité.
Un shell de connexion est ce que vous obtenez lorsque vous démarrez une machine ou changez de console virtuelle CTRLALTF1via FNthla console virtuelle.
Un shell de connexion se charge /etc/profile
pendant le chargement des /etc/profile.d/*.sh
fichiers.
/etc/bash.bashrc
partir d'un shell non interactif./etc/profile
peut être lu par un shell non interactif. Voir Différence entre Shell de connexion et Shell sans connexion?