web-dev-qa-db-fra.com

Choisir entre .bashrc, .profile, .bash_profile, etc.

C’est embarrassant, mais après de nombreuses années d’utilisation des systèmes POSIX à plein temps, j’ai encore du mal à déterminer si une personnalisation de shell doit être insérée dans .bashrc, .profile ou ailleurs. Sans oublier certains fichiers de configuration spécifiques au système d'exploitation, tels que .pam_environment.

Oui, je sais comment comprendre la documentation et savoir quand chaque fichier est chargé ou non. Ce que je me demande, c'est si quelqu'un a tous mis en place des directives complètes sur la manière de décider dans quel fichier mettre un type de personnalisation donné.

185
Avdi

TL; DR:

  • ~/.bash_profile devrait être super simple et il suffit de charger .profile et .bashrc (dans cet ordre)

  • ~/.profile contient des éléments NON spécifiquement liés à bash, tels que des variables d'environnement (PATH et amis)

  • ~/.bashrc contient tout ce que vous souhaitez sur une ligne de commande interactive. Invite de commande, variable EDITOR, alias bash pour mon utilisation

Quelques autres notes:

  • Tout ce qui devrait être disponible pour les applications graphiques OR to sh (ou bash invoqué en tant que sh) DOIT être dans ~/.profile

  • ~/.bashrc ne doit rien sortir

  • Tout ce qui ne devrait être disponible que pour les shells de connexion devrait aller dans ~/.profile

  • Assurez-vous que ~/.bash_login n'existe pas.

206
Dan Rabinowitz

Au cours des dernières années, j'ai eu beaucoup de temps à perdre, alors je ai fait des recherches à ce sujet pendant un peu plus de 10 minutes. Je n'ai aucune idée si c'est la meilleure mise en page, c'est juste une qui fonctionne correctement dans à peu près tous les cas.

Les exigences:

  • ~/.profile doit être compatible avec tout/bin/sh - cela inclut bash, dash, ksh, tout ce que la distribution pourrait choisir d'utiliser.

  • Les variables d'environnement doivent être placées dans un fichier lu à la fois par les connexions de la console (c'est-à-dire un shell 'login') et par des connexions graphiques (par exemple, des gestionnaires d'affichage tels que GDM, LightDM ou LXDM).

  • Il y a très peu d'intérêt à avoir les deux ~/.profile et ~/.bash_profile. Si ce dernier est manquant, bash se fera un plaisir de l'utiliser, et toutes les lignes spécifiques à Bash peuvent être gardées avec un contrôle pour $BASH ou $BASH_VERSION.

  • La séparation entre *profile et *rc est que le premier est utilisé pour les shells de «connexion» et le dernier à chaque fois que vous ouvrez une fenêtre de terminal. Cependant, bash en mode 'login' ne source pas ~/.bashrc, donc ~/.profile doit le faire manuellement.

Le plus simple configuration serait:

  • Avoir un ~/.profile qui définit toutes les variables d’environnement (à l’exception de celles spécifiques à bash), imprime éventuellement une ligne ou deux, puis le code source ~/.bashrc s’il est exécuté par bash, en respectant la syntaxe sh-compatible sinon.

     exportation TZ = "Europe/Paris" 
     exportation EDITOR = "vim" 
     if ["$ BASH"]; puis
        . ~/.bashrc 
     fi 
     temps de disponibilité 
    
  • Avoir un ~/.bashrc qui effectue toute configuration spécifique à Shell, protégé avec une vérification de mode interactif pour éviter de casser des choses comme sftp sur Debian (où bash est compilé avec l'option de charger ~/.bashrc même pour les shells non interactifs) :

     [[$ - == * i *]] || renvoie 0 
     
     PS1 = '\ h\w\$' 
     
     start () {Service Sudo "$ 1" start; } 
    

Toutefois, il existe également un problème, à savoir que certaines commandes non interactives (par exemple, ssh <Host> ls) ignorent ~/.profile, mais les variables d’environnement leur seraient très utiles.

  • Certaines distributions (par exemple, Debian) compilent leur bash avec l’option de source ~/.bashrc pour ces connexions non interactives. Dans ce cas, il m'a été utile de déplacer toutes les variables d'environnement (les lignes export ...) dans un fichier séparé, ~/.environ, et de le source à partir de both .profile et .bashrc, avec un garde pour éviter de le faire. deux fois:

    si ! ["$ PREFIX"]; puis # ou $ EDITOR, ou $ TZ, ou ...
    . ~/.environ # généralement toute variable définie par .environ elle-même
    Fi
    
  • Malheureusement, pour d’autres distributions (par exemple Arch), je n’ai pas trouvé de très bonne solution. Une possibilité consiste à utiliser le module PAM (activé par défaut) pam_env en mettant les éléments suivants dans ~/.pam_environment:

     BASH_ENV =. /. Environ # pas une faute de frappe; cela doit être un chemin, mais ~ ne fonctionnera pas

    Ensuite, bien sûr, mettre à jour ~/.environ à unset BASH_ENV.


Conclusion? Les coquilles sont une douleur. Les variables d'environnement sont pénibles. Les options de compilation spécifiques à la distribution sont un immense douleur dans le cul.

50
grawity

Jetez un coup d'œil à cet excellent article de ShreevatsaR sur le blog . Voici un extrait, mais consultez l'article du blog, qui inclut une explication pour des termes tels que "login Shell", un organigramme et un tableau similaire pour Zsh.

Pour Bash, ils fonctionnent comme suit. Lisez la colonne appropriée. Exécute A, puis B, puis C, etc. B1, B2, B3 signifie qu’il n’exécute que le premier des fichiers trouvés.

+----------------+-----------+-----------+------+
|                |Interactive|Interactive|Script|
|                |login      |non-login  |      |
+----------------+-----------+-----------+------+
|/etc/profile    |   A       |           |      |
+----------------+-----------+-----------+------+
|/etc/bash.bashrc|           |    A      |      |
+----------------+-----------+-----------+------+
|~/.bashrc       |           |    B      |      |
+----------------+-----------+-----------+------+
|~/.bash_profile |   B1      |           |      |
+----------------+-----------+-----------+------+
|~/.bash_login   |   B2      |           |      |
+----------------+-----------+-----------+------+
|~/.profile      |   B3      |           |      |
+----------------+-----------+-----------+------+
|BASH_ENV        |           |           |  A   |
+----------------+-----------+-----------+------+
|                |           |           |      |
+----------------+-----------+-----------+------+
|                |           |           |      |
+----------------+-----------+-----------+------+
|~/.bash_logout  |    C      |           |      |
+----------------+-----------+-----------+------+
32
Flimm

Je vous propose mes directives "complètes":

  • Créez .bash_profile et .profile charge .bashrc s'il existe, en utilisant par exemple. [ -r $HOME/.bashrc ] && source $HOME/.bashrc
  • Mettez tout le reste dans .bashrc.
  • Arrête de t'en faire.
  • Tous les quatre ans environ, consacrez une dizaine de minutes à la recherche de cette question avant d'abandonner et de revenir à «ne vous inquiétez pas».

EDIT: Ajout de citations d'effarouchement à "complet" au cas où quelqu'un serait tenté de le croire. ;)

20
Mechanical Fish

J'ai renoncé à essayer de comprendre celui-ci et j'ai créé un script (~/.Shell-setup) que je tire de tous les autres.

Cette approche nécessite que ~/.Shell-setup ait deux fonctionnalités:

  1. N'exécutez qu'une seule fois, même si les sources sont répétées (utilisez Inclure les protecteurs )
  2. Ne générez aucune sortie indésirable (détectez quand la sortie est correcte)

# 1 est assez standard, bien que peut-être pas beaucoup utilisé dans les scripts Shell.

# 2 est plus compliqué. Voici ce que j'utilise dans bash:

if [ "" == "$BASH_EXECUTION_STRING" -a "" == "$DESKTOP_SESSION" ]; then
    echo "Hello user!" # ... etc
fi

Malheureusement, je ne me souviens pas comment je suis arrivé à cela, ni pourquoi détecter un Shell interactif ne suffisait pas.

0
ShadSterling