Global bash_profile

20

Je sais qu'il ya /etc/profileet /etc/bashrcfichiers pour définir des variables globales de l' environnement et peut - être que je suis juste malentendu leurs fins, mais ...

Existe-t-il un bash_profilefichier global ?

J'utilise Mac OS X

Hubro
la source

Réponses:

15

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/profilesi le shell est bash. Par exemple, dans mon /etc/profilej'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/profilefournit 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.bashrcest 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à.

ire_and_curses
la source
Ne lisez pas à /etc/bash.bashrcpartir d'un shell non interactif. /etc/profilepeut être lu par un shell non interactif. Voir Différence entre Shell de connexion et Shell sans connexion?
Gilles 'SO- arrête d'être méchant'
@ Gilles - Je ne sais pas exactement ce que vous essayez de faire valoir ici. Un shell de connexion non interactif est une chose inhabituelle en effet. Pour référence, le code que je cite n'est pas ma propre création. Il s'agit de la valeur /etc/profilepar défaut dans Ubuntu 12.04. Que suggéreriez-vous à la place si l'on voulait un /etc/profilequi n'était exécuté que sous bash, et aucun autre shell compatible sh?
ire_and_curses
Le système /etc/profilefichier pour mon système contient un commentaire au sommet qui se lit: # System-wide .profile for sh(1). Est-ce que cela signifie profileest shspécifique? shExécute- t-il en quelque sorte avant bash?
@Josh Voigts - shest un sous-ensemble de bash. /etc/profileest exécuté pour sh, bashet tous les autres shells compatibles Bourne.
ire_and_curses
@ire_and_curses Il semble que le fichier soit appelé /etc/bashrcsur le mac, pas /etc/bash.bashrc. Il semble également fonctionner /bin/shégalement.
BrainStorm.exe
4

/etc/profileest 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.

Gilles 'SO- arrête d'être méchant'
la source
0

Configuration du shell interactif (Bash) à l'échelle mondiale

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.

Coloriser Grep à l'échelle mondiale

/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

Comparez profile.d vs bashrc.d

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/profilependant le chargement des /etc/profile.d/*.shfichiers.

Jonathan Komar
la source